You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2024/11/22 01:15:18 UTC

(skywalking-banyandb) branch main updated: bug: fix the index mode still writes to the data files (#559)

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git


The following commit(s) were added to refs/heads/main by this push:
     new 05cf5e14 bug: fix the index mode still writes to the data files (#559)
05cf5e14 is described below

commit 05cf5e1426e0b3926819c2272497923cd705f72b
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Fri Nov 22 09:15:14 2024 +0800

    bug: fix the index mode still writes to the data files (#559)
---
 banyand/internal/storage/index.go                  | 10 +++-
 banyand/internal/storage/index_test.go             |  2 +-
 banyand/internal/storage/storage.go                |  3 +-
 banyand/measure/datapoints.go                      | 11 ++--
 banyand/measure/write.go                           | 65 ++++++++++++++++------
 banyand/stream/benchmark_test.go                   |  2 +-
 banyand/stream/write.go                            |  2 +-
 pkg/index/index.go                                 |  3 +-
 pkg/index/inverted/inverted_series.go              | 64 +++++++++++++--------
 pkg/index/inverted/inverted_series_test.go         | 44 ++++++++++-----
 pkg/test/measure/testdata/groups/index_mode.json   | 18 ++++++
 .../index_rule_bindings/service_traffic.json       |  2 +-
 .../index_rules/{layer.json => im_service_id.json} |  8 +--
 pkg/test/measure/testdata/index_rules/layer.json   |  2 +-
 .../measure/testdata/measures/service_traffic.json |  2 +-
 test/cases/init.go                                 |  4 +-
 test/cases/measure/data/input/entity.yaml          |  2 +-
 test/cases/measure/data/input/entity_in.yaml       |  2 +-
 test/cases/measure/data/input/entity_service.yaml  |  2 +-
 test/cases/measure/data/input/index_mode_all.yaml  |  2 +-
 test/cases/measure/data/input/index_mode_none.yaml |  2 +-
 .../measure/data/input/index_mode_order_desc.yaml  |  2 +-
 .../cases/measure/data/input/index_mode_range.yaml |  2 +-
 test/cases/measure/data/input/no_field.yaml        |  2 +-
 test/cases/measure/data/input/tag_filter_int.yaml  |  2 +-
 25 files changed, 176 insertions(+), 84 deletions(-)

diff --git a/banyand/internal/storage/index.go b/banyand/internal/storage/index.go
index 45432c99..5da4392a 100644
--- a/banyand/internal/storage/index.go
+++ b/banyand/internal/storage/index.go
@@ -71,8 +71,14 @@ func newSeriesIndex(ctx context.Context, root string, flushTimeoutSeconds int64,
 	return si, nil
 }
 
-func (s *seriesIndex) Write(docs index.Documents) error {
-	return s.store.SeriesBatch(index.Batch{
+func (s *seriesIndex) Insert(docs index.Documents) error {
+	return s.store.InsertSeriesBatch(index.Batch{
+		Documents: docs,
+	})
+}
+
+func (s *seriesIndex) Update(docs index.Documents) error {
+	return s.store.UpdateSeriesBatch(index.Batch{
 		Documents: docs,
 	})
 }
diff --git a/banyand/internal/storage/index_test.go b/banyand/internal/storage/index_test.go
index 3fd39aed..73220a3e 100644
--- a/banyand/internal/storage/index_test.go
+++ b/banyand/internal/storage/index_test.go
@@ -64,7 +64,7 @@ func TestSeriesIndex_Primary(t *testing.T) {
 		copy(doc.EntityValues, series.Buffer)
 		docs = append(docs, doc)
 	}
-	require.NoError(t, si.Write(docs))
+	require.NoError(t, si.Insert(docs))
 	// Restart the index
 	require.NoError(t, si.Close())
 	si, err = newSeriesIndex(ctx, path, 0, nil)
diff --git a/banyand/internal/storage/storage.go b/banyand/internal/storage/storage.go
index aed7a40c..6ca23a15 100644
--- a/banyand/internal/storage/storage.go
+++ b/banyand/internal/storage/storage.go
@@ -80,7 +80,8 @@ type FieldResultList []FieldResult
 
 // IndexDB is the interface of index database.
 type IndexDB interface {
-	Write(docs index.Documents) error
+	Insert(docs index.Documents) error
+	Update(docs index.Documents) error
 	Search(ctx context.Context, series []*pbv1.Series, opts IndexSearchOpts) (pbv1.SeriesList, FieldResultList, []int64, [][]byte, error)
 }
 
diff --git a/banyand/measure/datapoints.go b/banyand/measure/datapoints.go
index 156d4b45..81828a34 100644
--- a/banyand/measure/datapoints.go
+++ b/banyand/measure/datapoints.go
@@ -166,9 +166,10 @@ type dataPointsInTable struct {
 }
 
 type dataPointsInGroup struct {
-	tsdb     storage.TSDB[*tsTable, option]
-	docs     index.Documents
-	tables   []*dataPointsInTable
-	segments []storage.Segment[*tsTable, option]
-	latestTS int64
+	tsdb          storage.TSDB[*tsTable, option]
+	metadataDocs  index.Documents
+	indexModeDocs index.Documents
+	tables        []*dataPointsInTable
+	segments      []storage.Segment[*tsTable, option]
+	latestTS      int64
 }
diff --git a/banyand/measure/write.go b/banyand/measure/write.go
index ab0879a2..d6acc9fa 100644
--- a/banyand/measure/write.go
+++ b/banyand/measure/write.go
@@ -83,14 +83,6 @@ func (w *writeCallback) handle(dst map[string]*dataPointsInGroup, writeEvent *me
 			break
 		}
 	}
-	shardID := common.ShardID(writeEvent.ShardId)
-	if dpt == nil {
-		if dpt, err = w.newDpt(tsdb, dpg, t, ts, shardID); err != nil {
-			return nil, fmt.Errorf("cannot create data points in table: %w", err)
-		}
-	}
-	dpt.dataPoints.timestamps = append(dpt.dataPoints.timestamps, ts)
-	dpt.dataPoints.versions = append(dpt.dataPoints.versions, req.DataPoint.Version)
 	stm, ok := w.schemaRepo.loadMeasure(req.GetMetadata())
 	if !ok {
 		return nil, fmt.Errorf("cannot find measure definition: %s", req.GetMetadata())
@@ -102,6 +94,14 @@ func (w *writeCallback) handle(dst map[string]*dataPointsInGroup, writeEvent *me
 	if fLen > len(stm.schema.GetTagFamilies()) {
 		return nil, fmt.Errorf("%s has more tag families than %s", req.Metadata, stm.schema)
 	}
+
+	shardID := common.ShardID(writeEvent.ShardId)
+	if dpt == nil {
+		if dpt, err = w.newDpt(tsdb, dpg, t, ts, shardID, stm.schema.IndexMode); err != nil {
+			return nil, fmt.Errorf("cannot create data points in table: %w", err)
+		}
+	}
+
 	series := &pbv1.Series{
 		Subject:      req.Metadata.Name,
 		EntityValues: writeEvent.EntityValues,
@@ -109,7 +109,24 @@ func (w *writeCallback) handle(dst map[string]*dataPointsInGroup, writeEvent *me
 	if err := series.Marshal(); err != nil {
 		return nil, fmt.Errorf("cannot marshal series: %w", err)
 	}
+
+	tagFamily, fields := w.handleTagFamily(stm, req)
+	if stm.schema.IndexMode {
+		doc := index.Document{
+			DocID:        uint64(series.ID),
+			EntityValues: series.Buffer,
+			Fields:       fields,
+		}
+		doc.Timestamp = ts
+		dpg.indexModeDocs = append(dpg.indexModeDocs, doc)
+		return dst, nil
+	}
+
+	dpt.dataPoints.tagFamilies = append(dpt.dataPoints.tagFamilies, tagFamily)
+	dpt.dataPoints.timestamps = append(dpt.dataPoints.timestamps, ts)
+	dpt.dataPoints.versions = append(dpt.dataPoints.versions, req.DataPoint.Version)
 	dpt.dataPoints.seriesIDs = append(dpt.dataPoints.seriesIDs, series.ID)
+
 	field := nameValues{}
 	for i := range stm.GetSchema().GetFields() {
 		var v *modelv1.FieldValue
@@ -125,8 +142,6 @@ func (w *writeCallback) handle(dst map[string]*dataPointsInGroup, writeEvent *me
 		))
 	}
 	dpt.dataPoints.fields = append(dpt.dataPoints.fields, field)
-	tagFamily, fields := w.handleTagFamily(stm, req)
-	dpt.dataPoints.tagFamilies = append(dpt.dataPoints.tagFamilies, tagFamily)
 
 	if stm.processorManager != nil {
 		stm.processorManager.onMeasureWrite(uint64(series.ID), &measurev1.InternalWriteRequest{
@@ -144,15 +159,14 @@ func (w *writeCallback) handle(dst map[string]*dataPointsInGroup, writeEvent *me
 		EntityValues: series.Buffer,
 		Fields:       fields,
 	}
-	if stm.schema.IndexMode {
-		doc.Timestamp = ts
-	}
-	dpg.docs = append(dpg.docs, doc)
+	dpg.metadataDocs = append(dpg.metadataDocs, doc)
 
 	return dst, nil
 }
 
-func (w *writeCallback) newDpt(tsdb storage.TSDB[*tsTable, option], dpg *dataPointsInGroup, t time.Time, ts int64, shardID common.ShardID) (*dataPointsInTable, error) {
+func (w *writeCallback) newDpt(tsdb storage.TSDB[*tsTable, option], dpg *dataPointsInGroup,
+	t time.Time, ts int64, shardID common.ShardID, indexMode bool,
+) (*dataPointsInTable, error) {
 	var segment storage.Segment[*tsTable, option]
 	for _, seg := range dpg.segments {
 		if seg.GetTimeRange().Contains(ts) {
@@ -167,6 +181,12 @@ func (w *writeCallback) newDpt(tsdb storage.TSDB[*tsTable, option], dpg *dataPoi
 		}
 		dpg.segments = append(dpg.segments, segment)
 	}
+	if indexMode {
+		return &dataPointsInTable{
+			timeRange: segment.GetTimeRange(),
+		}, nil
+	}
+
 	tstb, err := segment.CreateTSTableIfNotExist(shardID)
 	if err != nil {
 		return nil, fmt.Errorf("cannot create ts table: %w", err)
@@ -295,11 +315,20 @@ func (w *writeCallback) Rev(_ context.Context, message bus.Message) (resp bus.Me
 		g := groups[i]
 		for j := range g.tables {
 			dps := g.tables[j]
-			dps.tsTable.mustAddDataPoints(&dps.dataPoints)
+			if dps.tsTable != nil {
+				dps.tsTable.mustAddDataPoints(&dps.dataPoints)
+			}
 		}
 		for _, segment := range g.segments {
-			if err := segment.IndexDB().Write(g.docs); err != nil {
-				w.l.Error().Err(err).Msg("cannot write index")
+			if len(g.metadataDocs) > 0 {
+				if err := segment.IndexDB().Insert(g.metadataDocs); err != nil {
+					w.l.Error().Err(err).Msg("cannot write metadata")
+				}
+			}
+			if len(g.indexModeDocs) > 0 {
+				if err := segment.IndexDB().Update(g.indexModeDocs); err != nil {
+					w.l.Error().Err(err).Msg("cannot write index")
+				}
 			}
 			segment.DecRef()
 		}
diff --git a/banyand/stream/benchmark_test.go b/banyand/stream/benchmark_test.go
index 5aa0e10e..cf2b52a9 100644
--- a/banyand/stream/benchmark_test.go
+++ b/banyand/stream/benchmark_test.go
@@ -220,7 +220,7 @@ func write(b *testing.B, p parameter, esList []*elements, docsList []index.Docum
 	}
 	seg, err := db.CreateSegmentIfNotExist(time.Unix(0, esList[0].timestamps[0]))
 	require.NoError(b, err)
-	seg.IndexDB().Write(docs)
+	seg.IndexDB().Insert(docs)
 
 	tst, err := seg.CreateTSTableIfNotExist(common.ShardID(0))
 	require.NoError(b, err)
diff --git a/banyand/stream/write.go b/banyand/stream/write.go
index 610a6781..12ee5af4 100644
--- a/banyand/stream/write.go
+++ b/banyand/stream/write.go
@@ -267,7 +267,7 @@ func (w *writeCallback) Rev(_ context.Context, message bus.Message) (resp bus.Me
 		}
 		if len(g.docs) > 0 {
 			for _, segment := range g.segments {
-				if err := segment.IndexDB().Write(g.docs); err != nil {
+				if err := segment.IndexDB().Insert(g.docs); err != nil {
 					w.l.Error().Err(err).Msg("cannot write index")
 				}
 				segment.DecRef()
diff --git a/pkg/index/index.go b/pkg/index/index.go
index 88485605..55387048 100644
--- a/pkg/index/index.go
+++ b/pkg/index/index.go
@@ -169,7 +169,8 @@ type Batch struct {
 // Writer allows writing fields and docID in a document to an index.
 type Writer interface {
 	Batch(batch Batch) error
-	SeriesBatch(batch Batch) error
+	InsertSeriesBatch(batch Batch) error
+	UpdateSeriesBatch(batch Batch) error
 }
 
 // FieldIterable allows building a FieldIterator.
diff --git a/pkg/index/inverted/inverted_series.go b/pkg/index/inverted/inverted_series.go
index 59feb2c5..a5d4c12c 100644
--- a/pkg/index/inverted/inverted_series.go
+++ b/pkg/index/inverted/inverted_series.go
@@ -38,7 +38,7 @@ import (
 
 var emptySeries = make([]index.SeriesDocument, 0)
 
-func (s *store) SeriesBatch(batch index.Batch) error {
+func (s *store) InsertSeriesBatch(batch index.Batch) error {
 	if len(batch.Documents) == 0 {
 		return nil
 	}
@@ -49,34 +49,52 @@ func (s *store) SeriesBatch(batch index.Batch) error {
 	b := generateBatch()
 	defer releaseBatch(b)
 	for _, d := range batch.Documents {
-		doc := bluge.NewDocument(convert.BytesToString(d.EntityValues))
-		for _, f := range d.Fields {
-			tf := bluge.NewKeywordFieldBytes(f.Key.Marshal(), f.Term)
-			if !f.Index {
-				tf.FieldOptions = 0
-			} else if !f.NoSort {
-				tf.Sortable()
-			}
+		doc := toDoc(d)
+		b.InsertIfAbsent(doc.ID(), doc)
+	}
+	return s.writer.Batch(b)
+}
 
-			if f.Store {
-				tf.StoreValue()
-			}
-			if f.Key.Analyzer != index.AnalyzerUnspecified {
-				tf = tf.WithAnalyzer(Analyzers[f.Key.Analyzer])
-			}
-			doc.AddField(tf)
+func (s *store) UpdateSeriesBatch(batch index.Batch) error {
+	if len(batch.Documents) == 0 {
+		return nil
+	}
+	if !s.closer.AddRunning() {
+		return nil
+	}
+	defer s.closer.Done()
+	b := generateBatch()
+	defer releaseBatch(b)
+	for _, d := range batch.Documents {
+		doc := toDoc(d)
+		b.Update(doc.ID(), doc)
+	}
+	return s.writer.Batch(b)
+}
+
+func toDoc(d index.Document) *bluge.Document {
+	doc := bluge.NewDocument(convert.BytesToString(d.EntityValues))
+	for _, f := range d.Fields {
+		tf := bluge.NewKeywordFieldBytes(f.Key.Marshal(), f.Term)
+		if !f.Index {
+			tf.FieldOptions = 0
+		} else if !f.NoSort {
+			tf.Sortable()
 		}
 
-		if d.Timestamp > 0 {
-			doc.AddField(bluge.NewDateTimeField(timestampField, time.Unix(0, d.Timestamp)).StoreValue())
+		if f.Store {
+			tf.StoreValue()
 		}
-		if len(d.Fields) == 0 {
-			b.InsertIfAbsent(doc.ID(), doc)
-		} else {
-			b.Update(doc.ID(), doc)
+		if f.Key.Analyzer != index.AnalyzerUnspecified {
+			tf = tf.WithAnalyzer(Analyzers[f.Key.Analyzer])
 		}
+		doc.AddField(tf)
 	}
-	return s.writer.Batch(b)
+
+	if d.Timestamp > 0 {
+		doc.AddField(bluge.NewDateTimeField(timestampField, time.Unix(0, d.Timestamp)).StoreValue())
+	}
+	return doc
 }
 
 // BuildQuery implements index.SeriesStore.
diff --git a/pkg/index/inverted/inverted_series_test.go b/pkg/index/inverted/inverted_series_test.go
index ac546ca9..5f3f384c 100644
--- a/pkg/index/inverted/inverted_series_test.go
+++ b/pkg/index/inverted/inverted_series_test.go
@@ -20,6 +20,7 @@ package inverted
 import (
 	"context"
 	"maps"
+	"sort"
 	"testing"
 	"time"
 
@@ -63,7 +64,7 @@ func TestStore_Search(t *testing.T) {
 	}()
 
 	// Setup some data
-	setupData(tester, s)
+	insertData(tester, s)
 
 	// Test cases
 	tests := []struct {
@@ -203,6 +204,12 @@ func TestStore_Search(t *testing.T) {
 			require.NoError(t, err)
 			got, err := s.Search(context.Background(), tt.projection, query)
 			require.NoError(t, err)
+			sort.Slice(tt.want, func(i, j int) bool {
+				return string(tt.want[i].Key.EntityValues) < string(tt.want[j].Key.EntityValues)
+			})
+			sort.Slice(got, func(i, j int) bool {
+				return string(got[i].Key.EntityValues) < string(got[j].Key.EntityValues)
+			})
 			assert.Equal(t, tt.want, got)
 		})
 	}
@@ -222,7 +229,7 @@ func TestStore_SearchWildcard(t *testing.T) {
 	}()
 
 	// Setup some data
-	setupData(tester, s)
+	insertData(tester, s)
 
 	// Test cases
 	tests := []struct {
@@ -316,7 +323,7 @@ func TestStore_SearchPrefix(t *testing.T) {
 	}()
 
 	// Setup some data
-	setupData(tester, s)
+	insertData(tester, s)
 
 	// Test cases
 	tests := []struct {
@@ -389,7 +396,7 @@ func TestStore_SearchWithSecondaryQuery(t *testing.T) {
 	}()
 
 	// Setup some data
-	setupData(tester, s)
+	insertData(tester, s)
 
 	// Define the secondary query
 	secondaryQuery := &queryNode{
@@ -500,7 +507,7 @@ func TestStore_SeriesSort(t *testing.T) {
 	}()
 
 	// Setup some data
-	setupData(tester, s)
+	updateData(tester, s)
 
 	// Define the order by field
 	orderBy := &index.OrderBy{
@@ -729,7 +736,7 @@ func TestStore_TimestampSort(t *testing.T) {
 	}()
 
 	// Setup some data
-	setupData(tester, s)
+	updateData(tester, s)
 
 	// Define the order by field
 	orderBy := &index.OrderBy{
@@ -883,7 +890,13 @@ func TestStore_TimestampSort(t *testing.T) {
 	}
 }
 
-func setupData(tester *require.Assertions, s index.SeriesStore) {
+func insertData(tester *require.Assertions, s index.SeriesStore) {
+	b1, b2 := generateDocs()
+	tester.NoError(s.InsertSeriesBatch(b1))
+	tester.NoError(s.InsertSeriesBatch(b2))
+}
+
+func generateDocs() (index.Batch, index.Batch) {
 	series1 := index.Document{
 		EntityValues: []byte("test1"),
 	}
@@ -965,10 +978,15 @@ func setupData(tester *require.Assertions, s index.SeriesStore) {
 		},
 		Timestamp: int64(2001),
 	}
-	tester.NoError(s.SeriesBatch(index.Batch{
-		Documents: []index.Document{series1, series2, series4, series3},
-	}))
-	tester.NoError(s.SeriesBatch(index.Batch{
-		Documents: []index.Document{series3},
-	}))
+	return index.Batch{
+			Documents: []index.Document{series1, series2, series4, series3},
+		}, index.Batch{
+			Documents: []index.Document{series3},
+		}
+}
+
+func updateData(tester *require.Assertions, s index.SeriesStore) {
+	b1, b2 := generateDocs()
+	tester.NoError(s.UpdateSeriesBatch(b1))
+	tester.NoError(s.UpdateSeriesBatch(b2))
 }
diff --git a/pkg/test/measure/testdata/groups/index_mode.json b/pkg/test/measure/testdata/groups/index_mode.json
new file mode 100644
index 00000000..fb0d9b4b
--- /dev/null
+++ b/pkg/test/measure/testdata/groups/index_mode.json
@@ -0,0 +1,18 @@
+{
+  "metadata": {
+    "name": "index_mode"
+  },
+  "catalog": "CATALOG_MEASURE",
+  "resource_opts": {
+    "shard_num": 2,
+    "segment_interval": {
+      "unit": "UNIT_DAY",
+      "num": 1
+    },
+    "ttl": {
+      "unit": "UNIT_DAY",
+      "num": 7
+    }
+  },
+  "updated_at": "2021-04-15T01:30:15.01Z"
+}
\ No newline at end of file
diff --git a/pkg/test/measure/testdata/index_rule_bindings/service_traffic.json b/pkg/test/measure/testdata/index_rule_bindings/service_traffic.json
index 6a1bf9bc..08b65e0d 100644
--- a/pkg/test/measure/testdata/index_rule_bindings/service_traffic.json
+++ b/pkg/test/measure/testdata/index_rule_bindings/service_traffic.json
@@ -1,7 +1,7 @@
 {
   "metadata": {
     "name": "service_traffic_rule_binding",
-    "group": "sw_metric"
+    "group": "index_mode"
   },
   "rules": [
     "service_id",
diff --git a/pkg/test/measure/testdata/index_rules/layer.json b/pkg/test/measure/testdata/index_rules/im_service_id.json
similarity index 57%
copy from pkg/test/measure/testdata/index_rules/layer.json
copy to pkg/test/measure/testdata/index_rules/im_service_id.json
index 32d73999..549a4037 100644
--- a/pkg/test/measure/testdata/index_rules/layer.json
+++ b/pkg/test/measure/testdata/index_rules/im_service_id.json
@@ -1,11 +1,11 @@
 {
   "metadata": {
-    "id": 3,
-    "name": "layer",
-    "group": "sw_metric"
+    "id": 1,
+    "name": "service_id",
+    "group": "index_mode"
   },
   "tags": [
-    "layer"
+    "service_id"
   ],
   "type": "TYPE_INVERTED",
   "updated_at": "2021-04-15T01:30:15.01Z"
diff --git a/pkg/test/measure/testdata/index_rules/layer.json b/pkg/test/measure/testdata/index_rules/layer.json
index 32d73999..dbf70d7a 100644
--- a/pkg/test/measure/testdata/index_rules/layer.json
+++ b/pkg/test/measure/testdata/index_rules/layer.json
@@ -2,7 +2,7 @@
   "metadata": {
     "id": 3,
     "name": "layer",
-    "group": "sw_metric"
+    "group": "index_mode"
   },
   "tags": [
     "layer"
diff --git a/pkg/test/measure/testdata/measures/service_traffic.json b/pkg/test/measure/testdata/measures/service_traffic.json
index 887d1adb..1cf0608b 100644
--- a/pkg/test/measure/testdata/measures/service_traffic.json
+++ b/pkg/test/measure/testdata/measures/service_traffic.json
@@ -1,7 +1,7 @@
 {
   "metadata": {
     "name": "service_traffic",
-    "group": "sw_metric"
+    "group": "index_mode"
   },
   "tag_families": [
     {
diff --git a/test/cases/init.go b/test/cases/init.go
index 64b60fae..c09946fc 100644
--- a/test/cases/init.go
+++ b/test/cases/init.go
@@ -41,8 +41,8 @@ func Initialize(addr string, now time.Time) {
 	casesstreamdata.Write(conn, "duplicated", now, 0)
 	// // measure
 	interval = time.Minute
-	casesmeasuredata.Write(conn, "service_traffic", "sw_metric", "service_traffic_data_old.json", now.AddDate(0, 0, -1), interval)
-	casesmeasuredata.Write(conn, "service_traffic", "sw_metric", "service_traffic_data.json", now, interval)
+	casesmeasuredata.Write(conn, "service_traffic", "index_mode", "service_traffic_data_old.json", now.AddDate(0, 0, -1), interval)
+	casesmeasuredata.Write(conn, "service_traffic", "index_mode", "service_traffic_data.json", now, interval)
 	casesmeasuredata.Write(conn, "service_instance_traffic", "sw_metric", "service_instance_traffic_data.json", now, interval)
 	casesmeasuredata.Write(conn, "service_cpm_minute", "sw_metric", "service_cpm_minute_data.json", now, interval)
 	casesmeasuredata.Write(conn, "instance_clr_cpu_minute", "sw_metric", "instance_clr_cpu_minute_data.json", now, interval)
diff --git a/test/cases/measure/data/input/entity.yaml b/test/cases/measure/data/input/entity.yaml
index 8e37f7b8..58d7a100 100644
--- a/test/cases/measure/data/input/entity.yaml
+++ b/test/cases/measure/data/input/entity.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: ["sw_metric"]
+groups: ["index_mode"]
 tagProjection:
   tagFamilies:
   - name: "default"
diff --git a/test/cases/measure/data/input/entity_in.yaml b/test/cases/measure/data/input/entity_in.yaml
index b872a268..0bdedbe3 100644
--- a/test/cases/measure/data/input/entity_in.yaml
+++ b/test/cases/measure/data/input/entity_in.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: ["sw_metric"]
+groups: ["index_mode"]
 tagProjection:
   tagFamilies:
   - name: "default"
diff --git a/test/cases/measure/data/input/entity_service.yaml b/test/cases/measure/data/input/entity_service.yaml
index b85da375..bf6e8a7c 100644
--- a/test/cases/measure/data/input/entity_service.yaml
+++ b/test/cases/measure/data/input/entity_service.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: ["sw_metric"]
+groups: ["index_mode"]
 tagProjection:
   tagFamilies:
   - name: "default"
diff --git a/test/cases/measure/data/input/index_mode_all.yaml b/test/cases/measure/data/input/index_mode_all.yaml
index d0c01450..be5acb7d 100644
--- a/test/cases/measure/data/input/index_mode_all.yaml
+++ b/test/cases/measure/data/input/index_mode_all.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: [ "sw_metric" ]
+groups: [ "index_mode" ]
 tagProjection:
   tagFamilies:
   - name: "default"
diff --git a/test/cases/measure/data/input/index_mode_none.yaml b/test/cases/measure/data/input/index_mode_none.yaml
index 0b5e5761..f5575a35 100644
--- a/test/cases/measure/data/input/index_mode_none.yaml
+++ b/test/cases/measure/data/input/index_mode_none.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: [ "sw_metric" ]
+groups: [ "index_mode" ]
 tagProjection:
   tagFamilies:
   - name: "default"
diff --git a/test/cases/measure/data/input/index_mode_order_desc.yaml b/test/cases/measure/data/input/index_mode_order_desc.yaml
index 0dd0063d..7184f8a7 100644
--- a/test/cases/measure/data/input/index_mode_order_desc.yaml
+++ b/test/cases/measure/data/input/index_mode_order_desc.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: [ "sw_metric" ]
+groups: [ "index_mode" ]
 tagProjection:
   tagFamilies:
   - name: "default"
diff --git a/test/cases/measure/data/input/index_mode_range.yaml b/test/cases/measure/data/input/index_mode_range.yaml
index c881b11c..6e696e22 100644
--- a/test/cases/measure/data/input/index_mode_range.yaml
+++ b/test/cases/measure/data/input/index_mode_range.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: [ "sw_metric" ]
+groups: [ "index_mode" ]
 tagProjection:
   tagFamilies:
   - name: "default"
diff --git a/test/cases/measure/data/input/no_field.yaml b/test/cases/measure/data/input/no_field.yaml
index 8743c88c..eadd500b 100644
--- a/test/cases/measure/data/input/no_field.yaml
+++ b/test/cases/measure/data/input/no_field.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: ["sw_metric"]
+groups: ["index_mode"]
 tagProjection:
   tagFamilies:
   - name: "default"
diff --git a/test/cases/measure/data/input/tag_filter_int.yaml b/test/cases/measure/data/input/tag_filter_int.yaml
index d8c7d1a0..4658f2e7 100644
--- a/test/cases/measure/data/input/tag_filter_int.yaml
+++ b/test/cases/measure/data/input/tag_filter_int.yaml
@@ -16,7 +16,7 @@
 # under the License.
 
 name: "service_traffic"
-groups: ["sw_metric"]
+groups: ["index_mode"]
 tagProjection:
   tagFamilies:
   - name: "default"