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 69ad27b1 Improve granularity of index in `measure` by leveling up from
data point to series (#286)
69ad27b1 is described below
commit 69ad27b1834a2acf471166e1cf422796a40273b1
Author: Gao Hongtao <[email protected]>
AuthorDate: Tue Jun 27 20:51:43 2023 +0800
Improve granularity of index in `measure` by leveling up from data point to
series (#286)
---
CHANGES.md | 1 +
banyand/kv/badger.go | 2 +-
banyand/measure/measure_write.go | 21 +-
banyand/measure/service.go | 3 +
banyand/observability/meter_prom.go | 23 ++-
banyand/stream/service.go | 1 +
banyand/stream/stream_write.go | 5 +-
banyand/tsdb/block.go | 24 ++-
banyand/tsdb/buffer.go | 3 +
banyand/tsdb/index/writer.go | 18 +-
banyand/tsdb/scope.go | 13 ++
banyand/tsdb/series_seek.go | 1 -
banyand/tsdb/series_seek_sort.go | 5 +-
banyand/tsdb/series_write.go | 23 +++
banyand/tsdb/seriesdb.go | 200 +++++++++++++++++--
banyand/tsdb/tsdb.go | 10 +
pkg/query/logical/index_filter.go | 6 +
.../measure/measure_plan_indexscan_local.go | 34 ++--
test/cases/measure/data/input/bottom.yaml | 4 +-
test/cases/measure/data/input/group_max.yaml | 4 +-
test/cases/measure/data/input/group_no_field.yaml | 4 +-
test/cases/measure/data/input/in.yaml | 4 +-
test/cases/measure/data/input/linked_or.yaml | 10 +-
.../input/{tag_filter.yaml => order_tag_asc.yaml} | 10 +-
.../input/{tag_filter.yaml => order_tag_desc.yaml} | 10 +-
test/cases/measure/data/input/tag_filter.yaml | 2 +-
test/cases/measure/data/input/top.yaml | 4 +-
.../data/testdata/service_cpm_minute_data.json | 20 +-
.../data/testdata/service_cpm_minute_data1.json | 44 ++--
.../data/testdata/service_cpm_minute_data2.json | 62 ------
test/cases/measure/data/want/all.yaml | 158 ++-------------
test/cases/measure/data/want/bottom.yaml | 12 +-
test/cases/measure/data/want/group_max.yaml | 18 +-
test/cases/measure/data/want/group_no_field.yaml | 45 +++--
test/cases/measure/data/want/in.yaml | 18 +-
test/cases/measure/data/want/limit.yaml | 14 +-
test/cases/measure/data/want/linked_or.yaml | 18 +-
test/cases/measure/data/want/order_asc.yaml | 122 +----------
test/cases/measure/data/want/order_desc.yaml | 122 +----------
.../data/want/{in.yaml => order_tag_asc.yaml} | 78 +++++++-
.../data/want/{in.yaml => order_tag_desc.yaml} | 80 +++++++-
test/cases/measure/data/want/tag_filter.yaml | 63 ++++--
test/cases/measure/data/want/top.yaml | 12 +-
test/cases/measure/data/want/update.yaml | 222 +++++++++++----------
test/cases/measure/measure.go | 2 +
test/e2e-v2/script/env | 6 +-
test/integration/cold_query/query_suite_test.go | 2 -
test/integration/other/measure_test.go | 7 +-
test/integration/other/tls_test.go | 7 +-
test/integration/query/query_suite_test.go | 2 -
test/stress/cases/istio/report.md | 67 ++++---
51 files changed, 837 insertions(+), 809 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index c510cb25..b5a83500 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -23,6 +23,7 @@ Release Notes.
- Add the Istio scenario stress test based on the data generated by the
integration access log.
- Generalize the index's docID to uint64.
- Remove redundant ID tag type.
+- Improve granularity of index in `measure` by leveling up from data point to
series.
### Bugs
diff --git a/banyand/kv/badger.go b/banyand/kv/badger.go
index f26f2f57..d1f998ad 100644
--- a/banyand/kv/badger.go
+++ b/banyand/kv/badger.go
@@ -244,7 +244,7 @@ func (b *badgerDB) Get(key []byte) ([]byte, error) {
func (b *badgerDB) GetAll(key []byte, applyFn func([]byte) error) error {
iter := b.db.NewIterator(badger.DefaultIteratorOptions)
var count int
- for iter.Seek(y.KeyWithTs(key, math.MaxInt64)); iter.Valid();
iter.Next() {
+ for iter.Seek(y.KeyWithTs(key, math.MaxUint64)); iter.Valid();
iter.Next() {
if !bytes.Equal(y.ParseKey(iter.Key()), key) {
break
}
diff --git a/banyand/measure/measure_write.go b/banyand/measure/measure_write.go
index 605bea42..2b5f561a 100644
--- a/banyand/measure/measure_write.go
+++ b/banyand/measure/measure_write.go
@@ -56,7 +56,8 @@ func (s *measure) write(shardID common.ShardID, entity
[]byte, entityValues tsdb
if err != nil {
return err
}
- series, err := shard.Series().Get(entity, entityValues)
+ seriesDB := shard.Series()
+ series, err := seriesDB.Get(entity, entityValues)
if err != nil {
return err
}
@@ -69,18 +70,18 @@ func (s *measure) write(shardID common.ShardID, entity
[]byte, entityValues tsdb
}
return err
}
- writeFn := func() (tsdb.Writer, error) {
+ writeFn := func() error {
builder := wp.WriterBuilder().Time(t)
for fi, family := range value.GetTagFamilies() {
spec := s.schema.GetTagFamilies()[fi]
bb, errMarshal := pbv1.EncodeFamily(spec, family)
if errMarshal != nil {
- return nil, errMarshal
+ return errMarshal
}
builder.Family(familyIdentity(spec.GetName(),
pbv1.TagFlag), bb)
}
if len(value.GetFields()) > len(s.schema.GetFields()) {
- return nil, errors.Wrap(errMalformedElement, "fields
number is more than expected")
+ return errors.Wrap(errMalformedElement, "fields number
is more than expected")
}
for fi, fieldValue := range value.GetFields() {
fieldSpec := s.schema.GetFields()[fi]
@@ -90,7 +91,7 @@ func (s *measure) write(shardID common.ShardID, entity
[]byte, entityValues tsdb
continue
}
if fType != fieldSpec.GetFieldType() {
- return nil, errors.Wrapf(errMalformedElement,
"field %s type is unexpected", fieldSpec.GetName())
+ return errors.Wrapf(errMalformedElement, "field
%s type is unexpected", fieldSpec.GetName())
}
data := encodeFieldValue(fieldValue)
if data == nil {
@@ -101,7 +102,7 @@ func (s *measure) write(shardID common.ShardID, entity
[]byte, entityValues tsdb
}
writer, errWrite := builder.Build()
if errWrite != nil {
- return nil, errWrite
+ return errWrite
}
_, errWrite = writer.Write()
if s.l.Debug().Enabled() {
@@ -114,15 +115,15 @@ func (s *measure) write(shardID common.ShardID, entity
[]byte, entityValues tsdb
Int("shard_id", int(shardID)).
Msg("write measure")
}
- return writer, errWrite
+ return errWrite
}
- writer, err := writeFn()
- if err != nil {
+
+ if err = writeFn(); err != nil {
_ = wp.Close()
return err
}
m := index.Message{
- LocalWriter: writer,
+ IndexWriter: tsdb.NewSeriesIndexWriter(series.ID(), seriesDB),
Value: index.Value{
TagFamilies: value.GetTagFamilies(),
Timestamp: t,
diff --git a/banyand/measure/service.go b/banyand/measure/service.go
index cec60cf7..04c1b9ce 100644
--- a/banyand/measure/service.go
+++ b/banyand/measure/service.go
@@ -202,5 +202,8 @@ func NewService(_ context.Context, metadata metadata.Repo,
repo discovery.Servic
repo: repo,
pipeline: pipeline,
stopCh: make(chan struct{}),
+ dbOpts: tsdb.DatabaseOpts{
+ IndexGranularity: tsdb.IndexGranularitySeries,
+ },
}, nil
}
diff --git a/banyand/observability/meter_prom.go
b/banyand/observability/meter_prom.go
index e148f09a..bd861b4e 100644
--- a/banyand/observability/meter_prom.go
+++ b/banyand/observability/meter_prom.go
@@ -21,6 +21,8 @@
package observability
import (
+ "sync"
+
grpcprom
"github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
@@ -30,7 +32,12 @@ import (
"google.golang.org/grpc"
)
-var reg = prometheus.NewRegistry()
+var (
+ reg = prometheus.NewRegistry()
+
+ once = sync.Once{}
+ srvMetrics *grpcprom.ServerMetrics
+)
func init() {
reg.MustRegister(prometheus.NewGoCollector())
@@ -48,11 +55,13 @@ func NewMeterProvider(scope meter.Scope) meter.Provider {
// MetricsServerInterceptor returns a server interceptor for metrics.
func MetricsServerInterceptor() (grpc.UnaryServerInterceptor,
grpc.StreamServerInterceptor) {
- srvMetrics := grpcprom.NewServerMetrics(
- grpcprom.WithServerHandlingTimeHistogram(
- grpcprom.WithHistogramBuckets([]float64{0.001, 0.01,
0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}),
- ),
- )
- reg.MustRegister(srvMetrics)
+ once.Do(func() {
+ srvMetrics = grpcprom.NewServerMetrics(
+ grpcprom.WithServerHandlingTimeHistogram(
+ grpcprom.WithHistogramBuckets([]float64{0.001,
0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}),
+ ),
+ )
+ reg.MustRegister(srvMetrics)
+ })
return srvMetrics.UnaryServerInterceptor(),
srvMetrics.StreamServerInterceptor()
}
diff --git a/banyand/stream/service.go b/banyand/stream/service.go
index 8afb9436..d395e9ca 100644
--- a/banyand/stream/service.go
+++ b/banyand/stream/service.go
@@ -162,6 +162,7 @@ func NewService(_ context.Context, metadata metadata.Repo,
repo discovery.Servic
pipeline: pipeline,
dbOpts: tsdb.DatabaseOpts{
EnableGlobalIndex: true,
+ IndexGranularity: tsdb.IndexGranularityBlock,
},
stopCh: make(chan struct{}),
}, nil
diff --git a/banyand/stream/stream_write.go b/banyand/stream/stream_write.go
index 78b086df..8c47dc7e 100644
--- a/banyand/stream/stream_write.go
+++ b/banyand/stream/stream_write.go
@@ -120,8 +120,9 @@ func (s *stream) write(shardID common.ShardID, entity
[]byte, entityValues tsdb.
return err
}
m := index.Message{
- Scope: tsdb.Entry(s.name),
- LocalWriter: writer,
+ Scope: tsdb.Entry(s.name),
+ IndexWriter: writer,
+ GlobalItemID: writer.ItemID(),
Value: index.Value{
TagFamilies: value.GetTagFamilies(),
Timestamp: t,
diff --git a/banyand/tsdb/block.go b/banyand/tsdb/block.go
index 4a10ceab..4f67416b 100644
--- a/banyand/tsdb/block.go
+++ b/banyand/tsdb/block.go
@@ -108,7 +108,7 @@ type block struct {
type openOpts struct {
tsTableFactory TSTableFactory
- inverted inverted.StoreOpts
+ inverted *inverted.StoreOpts
lsm lsm.StoreOpts
}
@@ -163,10 +163,12 @@ func options(ctx context.Context, root string, l
*logger.Logger) (openOpts, erro
}
options = o.(DatabaseOpts)
var opts openOpts
- opts.inverted = inverted.StoreOpts{
- Path: path.Join(root, componentSecondInvertedIdx),
- Logger: l.Named(componentSecondInvertedIdx),
- BatchWaitSec: options.BlockInvertedIndex.BatchWaitSec,
+ if options.IndexGranularity == IndexGranularityBlock {
+ opts.inverted = &inverted.StoreOpts{
+ Path: path.Join(root,
componentSecondInvertedIdx),
+ Logger: l.Named(componentSecondInvertedIdx),
+ BatchWaitSec: options.BlockInvertedIndex.BatchWaitSec,
+ }
}
opts.lsm = lsm.StoreOpts{
Path: path.Join(root, componentSecondLSMIdx),
@@ -198,13 +200,16 @@ func (b *block) open() (err error) {
return err
}
b.closableLst = append(b.closableLst, b.tsTable)
- if b.invertedIndex, err = inverted.NewStore(b.openOpts.inverted); err
!= nil {
- return err
+ if b.openOpts.inverted != nil {
+ if b.invertedIndex, err =
inverted.NewStore(*b.openOpts.inverted); err != nil {
+ return err
+ }
+ b.closableLst = append(b.closableLst, b.invertedIndex)
}
if b.lsmIndex, err = lsm.NewStore(b.openOpts.lsm); err != nil {
return err
}
- b.closableLst = append(b.closableLst, b.invertedIndex, b.lsmIndex)
+ b.closableLst = append(b.closableLst, b.lsmIndex)
b.ref.Store(0)
b.closed.Store(false)
blockOpenedTimeSecondsGauge.Set(float64(time.Now().Unix()),
b.position.LabelValues()...)
@@ -431,6 +436,9 @@ func (d *bDelegate) writeLSMIndex(fields []index.Field, id
common.ItemID) error
}
func (d *bDelegate) writeInvertedIndex(fields []index.Field, id common.ItemID)
error {
+ if d.delegate.invertedIndex == nil {
+ return errors.New("inverted index is not enabled")
+ }
total := 0
for _, f := range fields {
total += len(f.Marshal())
diff --git a/banyand/tsdb/buffer.go b/banyand/tsdb/buffer.go
index 49ebdf64..c586659b 100644
--- a/banyand/tsdb/buffer.go
+++ b/banyand/tsdb/buffer.go
@@ -161,6 +161,9 @@ func (b *Buffer) Read(key []byte, ts time.Time) ([]byte,
bool) {
// Close gracefully closes the Buffer and ensures that all pending operations
are completed.
func (b *Buffer) Close() error {
+ if b == nil {
+ return nil
+ }
b.closerOnce.Do(func() {
b.entryCloser.Done()
b.entryCloser.CloseThenWait()
diff --git a/banyand/tsdb/index/writer.go b/banyand/tsdb/index/writer.go
index 01afa143..d7f24d0c 100644
--- a/banyand/tsdb/index/writer.go
+++ b/banyand/tsdb/index/writer.go
@@ -38,10 +38,11 @@ import (
// Message wraps value and other info to generate relative indices.
type Message struct {
- Value Value
- LocalWriter tsdb.Writer
- BlockCloser io.Closer
- Scope tsdb.Entry
+ IndexWriter tsdb.IndexWriter
+ BlockCloser io.Closer
+ Value Value
+ Scope tsdb.Entry
+ GlobalItemID tsdb.GlobalItemID
}
// Value represents the input data for generating indices.
@@ -122,8 +123,8 @@ func NewWriter(ctx context.Context, options WriterOptions)
*Writer {
func (s *Writer) Write(m Message) {
err := multierr.Combine(
- s.writeLocalIndex(m.LocalWriter, m.Value),
- s.writeGlobalIndex(m.Scope, m.LocalWriter.ItemID(), m.Value),
+ s.writeLocalIndex(m.IndexWriter, m.Value),
+ s.writeGlobalIndex(m.Scope, m.GlobalItemID, m.Value),
m.BlockCloser.Close(),
)
if err != nil {
@@ -191,7 +192,7 @@ func (s *Writer) writeGlobalIndex(scope tsdb.Entry, ref
tsdb.GlobalItemID, value
)
}
-func (s *Writer) writeLocalIndex(writer tsdb.Writer, value Value) (err error) {
+func (s *Writer) writeLocalIndex(writer tsdb.IndexWriter, value Value) (err
error) {
collect := func(ruleIndexes []*partition.IndexRuleLocator, fn
func(fields []index.Field) error) error {
fields := make([]index.Field, 0)
for _, ruleIndex := range ruleIndexes {
@@ -213,6 +214,9 @@ func (s *Writer) writeLocalIndex(writer tsdb.Writer, value
Value) (err error) {
})
}
}
+ if len(fields) == 0 {
+ return nil
+ }
return fn(fields)
}
return multierr.Combine(
diff --git a/banyand/tsdb/scope.go b/banyand/tsdb/scope.go
index d28de9eb..5a157e6b 100644
--- a/banyand/tsdb/scope.go
+++ b/banyand/tsdb/scope.go
@@ -21,6 +21,7 @@ import (
"context"
"github.com/apache/skywalking-banyandb/api/common"
+ "github.com/apache/skywalking-banyandb/pkg/index"
)
var _ Shard = (*scopedShard)(nil)
@@ -73,6 +74,18 @@ type scopedSeriesDatabase struct {
scope Entry
}
+func (sdd *scopedSeriesDatabase) writeInvertedIndex(fields []index.Field,
seriesID common.SeriesID) error {
+ return sdd.delegated.writeInvertedIndex(fields, seriesID)
+}
+
+func (sdd *scopedSeriesDatabase) writeLSMIndex(fields []index.Field, seriesID
common.SeriesID) error {
+ return sdd.delegated.writeLSMIndex(fields, seriesID)
+}
+
+func (sdd *scopedSeriesDatabase) Search(ctx context.Context, path Path, filter
index.Filter, order *OrderBy) (SeriesList, error) {
+ return sdd.delegated.Search(ctx, path.prepend(sdd.scope), filter, order)
+}
+
func (sdd *scopedSeriesDatabase) Close() error {
return nil
}
diff --git a/banyand/tsdb/series_seek.go b/banyand/tsdb/series_seek.go
index 2534c15e..a802df32 100644
--- a/banyand/tsdb/series_seek.go
+++ b/banyand/tsdb/series_seek.go
@@ -62,7 +62,6 @@ type seekerBuilder struct {
seriesSpan *seriesSpan
indexRuleForSorting *databasev1.IndexRule
l *logger.Logger
- rangeOptsForSorting index.RangeOpts
order modelv1.Sort
}
diff --git a/banyand/tsdb/series_seek_sort.go b/banyand/tsdb/series_seek_sort.go
index 63f85ddc..4ea8a2c3 100644
--- a/banyand/tsdb/series_seek_sort.go
+++ b/banyand/tsdb/series_seek_sort.go
@@ -37,6 +37,7 @@ import (
var (
errUnspecifiedIndexType = errors.New("Unspecified index type")
emptyFilters = make([]filterFn, 0)
+ rangeOpts = index.RangeOpts{}
)
func (s *seekerBuilder) OrderByIndex(indexRule *databasev1.IndexRule, order
modelv1.Sort) SeekerBuilder {
@@ -84,9 +85,9 @@ func (s *seekerBuilder) buildSeriesByIndex() (series
[]Iterator, err error) {
}
switch s.indexRuleForSorting.GetType() {
case databasev1.IndexRule_TYPE_TREE:
- inner, err = b.lsmIndexReader().Iterator(fieldKey,
s.rangeOptsForSorting, s.order)
+ inner, err = b.lsmIndexReader().Iterator(fieldKey,
rangeOpts, s.order)
case databasev1.IndexRule_TYPE_INVERTED:
- inner, err = b.invertedIndexReader().Iterator(fieldKey,
s.rangeOptsForSorting, s.order)
+ inner, err = b.invertedIndexReader().Iterator(fieldKey,
rangeOpts, s.order)
case databasev1.IndexRule_TYPE_UNSPECIFIED:
return nil,
errors.WithMessagef(errUnspecifiedIndexType, "index rule:%v",
s.indexRuleForSorting)
}
diff --git a/banyand/tsdb/series_write.go b/banyand/tsdb/series_write.go
index f9035666..501689be 100644
--- a/banyand/tsdb/series_write.go
+++ b/banyand/tsdb/series_write.go
@@ -207,3 +207,26 @@ func (w *writer) Write() (GlobalItemID, error) {
Term: convert.Int64ToBytes(w.ts.UnixNano()),
}, id.ID)
}
+
+var _ IndexWriter = (*seriesIndexWriter)(nil)
+
+type seriesIndexWriter struct {
+ seriesDB SeriesDatabase
+ seriesID common.SeriesID
+}
+
+func (s *seriesIndexWriter) WriteInvertedIndex(fields []index.Field) error {
+ return s.seriesDB.writeInvertedIndex(fields, s.seriesID)
+}
+
+func (s *seriesIndexWriter) WriteLSMIndex(fields []index.Field) error {
+ return s.seriesDB.writeLSMIndex(fields, s.seriesID)
+}
+
+// NewSeriesIndexWriter returns a new series index writer.
+func NewSeriesIndexWriter(seriesID common.SeriesID, seriesDB SeriesDatabase)
IndexWriter {
+ return &seriesIndexWriter{
+ seriesID: seriesID,
+ seriesDB: seriesDB,
+ }
+}
diff --git a/banyand/tsdb/seriesdb.go b/banyand/tsdb/seriesdb.go
index 910f2b0d..803f7d14 100644
--- a/banyand/tsdb/seriesdb.go
+++ b/banyand/tsdb/seriesdb.go
@@ -23,6 +23,7 @@ import (
"errors"
"io"
"math"
+ "path"
"sort"
"strings"
"sync"
@@ -32,9 +33,15 @@ import (
"google.golang.org/protobuf/proto"
"github.com/apache/skywalking-banyandb/api/common"
+ databasev1
"github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
modelv1
"github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
"github.com/apache/skywalking-banyandb/banyand/kv"
"github.com/apache/skywalking-banyandb/pkg/convert"
+ "github.com/apache/skywalking-banyandb/pkg/index"
+ "github.com/apache/skywalking-banyandb/pkg/index/inverted"
+ "github.com/apache/skywalking-banyandb/pkg/index/lsm"
+ "github.com/apache/skywalking-banyandb/pkg/index/posting"
+ "github.com/apache/skywalking-banyandb/pkg/index/posting/roaring"
"github.com/apache/skywalking-banyandb/pkg/logger"
pbv1 "github.com/apache/skywalking-banyandb/pkg/pb/v1"
"github.com/apache/skywalking-banyandb/pkg/timestamp"
@@ -245,13 +252,22 @@ func prepend(src []byte, entry []byte) []byte {
return dst
}
+// OrderBy specifies the order of the result.
+type OrderBy struct {
+ Index *databasev1.IndexRule
+ Sort modelv1.Sort
+}
+
// SeriesDatabase allows retrieving series.
type SeriesDatabase interface {
io.Closer
GetByID(id common.SeriesID) (Series, error)
Get(key []byte, entityValues EntityValues) (Series, error)
List(ctx context.Context, path Path) (SeriesList, error)
+ Search(ctx context.Context, path Path, filter index.Filter, order
*OrderBy) (SeriesList, error)
SizeOnDisk() int64
+ writeInvertedIndex(fields []index.Field, seriesID common.SeriesID) error
+ writeLSMIndex(fields []index.Field, seriesID common.SeriesID) error
}
type blockDatabase interface {
@@ -270,6 +286,8 @@ var (
type seriesDB struct {
seriesMetadata kv.Store
+ invertedIndex index.Store
+ lsmIndex index.Store
l *logger.Logger
segCtrl *segmentController
position common.Position
@@ -277,6 +295,21 @@ type seriesDB struct {
sID common.ShardID
}
+func (s *seriesDB) writeInvertedIndex(fields []index.Field, seriesID
common.SeriesID) error {
+ if s.invertedIndex == nil {
+ return errors.New("inverted index is not enabled")
+ }
+ return s.invertedIndex.Write(fields, uint64(seriesID))
+}
+
+func (s *seriesDB) writeLSMIndex(fields []index.Field, seriesID
common.SeriesID) error {
+ if s.lsmIndex == nil {
+ return errors.New("lsm index is not enabled")
+ }
+ return s.lsmIndex.Write(fields, uint64(seriesID))
+}
+
+// nolint: contextcheck
func (s *seriesDB) GetByID(id common.SeriesID) (Series, error) {
var series string
if e := s.l.Debug(); e.Enabled() {
@@ -404,7 +437,8 @@ func (s *seriesDB) List(ctx context.Context, path Path)
(SeriesList, error) {
Uint64("series_id", uint64(seriesID)).
Msg("got a series with a full path")
}
- return []Series{newSeries(ctx, seriesID, series, s)}, nil
+ // nolint: contextcheck
+ return []Series{newSeries(s.context(), seriesID, series, s)},
nil
}
result := make([]Series, 0)
var err error
@@ -446,6 +480,123 @@ func (s *seriesDB) List(ctx context.Context, path Path)
(SeriesList, error) {
return result, err
}
+func (s *seriesDB) Search(ctx context.Context, path Path, filter index.Filter,
order *OrderBy) (SeriesList, error) {
+ if s.invertedIndex == nil || s.lsmIndex == nil {
+ return nil, errors.New("search is not supported")
+ }
+ if path.isFull {
+ return s.List(ctx, path)
+ }
+ if order == nil {
+ return s.filterSeries(ctx, path, filter)
+ }
+ fieldKey := index.FieldKey{
+ IndexRuleID: order.Index.GetMetadata().Id,
+ }
+ var iter index.FieldIterator
+ var err error
+ switch order.Index.Type {
+ case databasev1.IndexRule_TYPE_TREE:
+ iter, err = s.lsmIndex.Iterator(fieldKey, rangeOpts, order.Sort)
+ case databasev1.IndexRule_TYPE_INVERTED:
+ iter, err = s.invertedIndex.Iterator(fieldKey, rangeOpts,
order.Sort)
+ default:
+ return nil, errUnspecifiedIndexType
+ }
+ if err != nil {
+ return nil, err
+ }
+ defer func() {
+ err = multierr.Append(err, iter.Close())
+ }()
+ var pl posting.List
+ if pl, err = s.seriesFilter(ctx, path, filter); err != nil {
+ return nil, err
+ }
+ seriesList := make([]Series, 0)
+ for iter.Next() {
+ pv := iter.Val().Value
+ if err = pv.Intersect(pl); err != nil {
+ return nil, err
+ }
+ if pv.IsEmpty() {
+ continue
+ }
+ pIter := pv.Iterator()
+ for pIter.Next() {
+ var series Series
+ if series, err =
s.GetByID(common.SeriesID(pIter.Current())); err != nil {
+ return nil, multierr.Append(err, pIter.Close())
+ }
+ seriesList = append(seriesList, series)
+ }
+ if err = pIter.Close(); err != nil {
+ return nil, err
+ }
+ }
+ return seriesList, err
+}
+
+func (s *seriesDB) filterSeries(ctx context.Context, path Path, filter
index.Filter) (SeriesList, error) {
+ var seriesList SeriesList
+ var err error
+ if filter == nil {
+ return s.List(ctx, path)
+ }
+ var pl posting.List
+ if pl, err = filter.Execute(func(ruleType databasev1.IndexRule_Type)
(index.Searcher, error) {
+ switch ruleType {
+ case databasev1.IndexRule_TYPE_TREE:
+ return s.lsmIndex, nil
+ case databasev1.IndexRule_TYPE_INVERTED:
+ return s.invertedIndex, nil
+ default:
+ return nil, errUnspecifiedIndexType
+ }
+ }, 0); err != nil {
+ return nil, err
+ }
+
+ if len(path.seekKey) == 0 {
+ iter := pl.Iterator()
+ defer func() {
+ err = multierr.Append(err, iter.Close())
+ }()
+ for iter.Next() {
+ var series Series
+ if series, err =
s.GetByID(common.SeriesID(iter.Current())); err != nil {
+ return nil, err
+ }
+ seriesList = append(seriesList, series)
+ }
+ return seriesList, err
+ }
+ if seriesList, err = s.List(ctx, path); err != nil {
+ return nil, err
+ }
+ // Remove a series from seriesList if its ID is not in the pl
+ for i := 0; i < len(seriesList); i++ {
+ if !pl.Contains(uint64(seriesList[i].ID())) {
+ seriesList = append(seriesList[:i], seriesList[i+1:]...)
+ i--
+ }
+ }
+ return seriesList, nil
+}
+
+func (s *seriesDB) seriesFilter(ctx context.Context, path Path, filter
index.Filter) (posting.List, error) {
+ var sl SeriesList
+ var err error
+ if sl, err = s.filterSeries(ctx, path, filter); err != nil {
+ return nil, err
+ }
+ pl := roaring.NewPostingList()
+ for _, series := range sl {
+ pl.Insert(uint64(series.ID()))
+ }
+ return pl, nil
+}
+
func (s *seriesDB) span(ctx context.Context, timeRange timestamp.TimeRange)
([]blockDelegate, error) {
result := make([]blockDelegate, 0)
for _, s := range s.segCtrl.span(timeRange) {
@@ -497,10 +648,17 @@ func (s *seriesDB) context() context.Context {
}
func (s *seriesDB) Close() error {
- return s.seriesMetadata.Close()
+ err := s.seriesMetadata.Close()
+ if s.invertedIndex != nil {
+ err = multierr.Append(err, s.invertedIndex.Close())
+ }
+ if s.lsmIndex != nil {
+ err = multierr.Append(err, s.lsmIndex.Close())
+ }
+ return err
}
-func newSeriesDataBase(ctx context.Context, shardID common.ShardID, path
string, segCtrl *segmentController) (SeriesDatabase, error) {
+func newSeriesDataBase(ctx context.Context, shardID common.ShardID, root
string, segCtrl *segmentController) (SeriesDatabase, error) {
sdb := &seriesDB{
sID: shardID,
segCtrl: segCtrl,
@@ -508,25 +666,41 @@ func newSeriesDataBase(ctx context.Context, shardID
common.ShardID, path string,
position: common.GetPosition(ctx),
}
o := ctx.Value(OptionsKey)
+ var options DatabaseOpts
+ if o == nil {
+ options = DatabaseOpts{}
+ } else {
+ options = o.(DatabaseOpts)
+ }
var memSize int64
- if o != nil {
- options := o.(DatabaseOpts)
- if options.SeriesMemSize > 1 {
- memSize = int64(options.SeriesMemSize)
- } else {
- memSize = defaultKVMemorySize
- }
+ if options.SeriesMemSize > 1 {
+ memSize = int64(options.SeriesMemSize)
} else {
memSize = defaultKVMemorySize
}
var err error
- sdb.seriesMetadata, err = kv.OpenStore(path+"/md",
+ if sdb.seriesMetadata, err = kv.OpenStore(root+"/md",
kv.StoreWithNamedLogger("metadata", sdb.l),
kv.StoreWithMemTableSize(memSize),
- )
- if err != nil {
+ ); err != nil {
return nil, err
}
+ if options.IndexGranularity == IndexGranularitySeries {
+ if sdb.invertedIndex, err =
inverted.NewStore(inverted.StoreOpts{
+ Path: path.Join(root,
componentSecondInvertedIdx),
+ Logger: sdb.l.Named(componentSecondInvertedIdx),
+ BatchWaitSec: options.BlockInvertedIndex.BatchWaitSec,
+ }); err != nil {
+ return nil, err
+ }
+ if sdb.lsmIndex, err = lsm.NewStore(lsm.StoreOpts{
+ Path: path.Join(root, componentSecondLSMIdx),
+ Logger: sdb.l.Named(componentSecondLSMIdx),
+ MemTableSize: defaultKVMemorySize,
+ }); err != nil {
+ return nil, err
+ }
+ }
return sdb, nil
}
diff --git a/banyand/tsdb/tsdb.go b/banyand/tsdb/tsdb.go
index c3035d39..c47f2d72 100644
--- a/banyand/tsdb/tsdb.go
+++ b/banyand/tsdb/tsdb.go
@@ -100,6 +100,15 @@ type Shard interface {
TriggerSchedule(task string) bool
}
+// IndexGranularity denotes the granularity of the local index.
+type IndexGranularity int
+
+// The options of the local index granularity.
+const (
+ IndexGranularityBlock IndexGranularity = iota
+ IndexGranularitySeries
+)
+
var _ Database = (*database)(nil)
// DatabaseOpts wraps options to create a tsdb.
@@ -114,6 +123,7 @@ type DatabaseOpts struct {
GlobalIndexMemSize run.Bytes
ShardNum uint32
EnableGlobalIndex bool
+ IndexGranularity IndexGranularity
}
// InvertedIndexOpts wraps options to create the block inverted index.
diff --git a/pkg/query/logical/index_filter.go
b/pkg/query/logical/index_filter.go
index 85bf74ea..0d16d180 100644
--- a/pkg/query/logical/index_filter.go
+++ b/pkg/query/logical/index_filter.go
@@ -81,6 +81,12 @@ func BuildLocalFilter(criteria *modelv1.Criteria, schema
Schema, entityDict map[
if le.GetLeft() == nil && le.GetRight() == nil {
return nil, nil,
errors.WithMessagef(errInvalidLogicalExpression, "both sides(left and right) of
[%v] are empty", criteria)
}
+ if le.GetLeft() == nil {
+ return BuildLocalFilter(le.Right, schema, entityDict,
entity)
+ }
+ if le.GetRight() == nil {
+ return BuildLocalFilter(le.Left, schema, entityDict,
entity)
+ }
left, leftEntities, err := BuildLocalFilter(le.Left, schema,
entityDict, entity)
if err != nil {
return nil, nil, err
diff --git a/pkg/query/logical/measure/measure_plan_indexscan_local.go
b/pkg/query/logical/measure/measure_plan_indexscan_local.go
index af2ea278..1b45fdfd 100644
--- a/pkg/query/logical/measure/measure_plan_indexscan_local.go
+++ b/pkg/query/logical/measure/measure_plan_indexscan_local.go
@@ -123,6 +123,13 @@ func (i *localIndexScan) Sort(order *logical.OrderBy) {
}
func (i *localIndexScan) Execute(ec executor.MeasureExecutionContext) (mit
executor.MIterator, err error) {
+ var orderBy *tsdb.OrderBy
+ if i.order.Index != nil {
+ orderBy = &tsdb.OrderBy{
+ Index: i.order.Index,
+ Sort: i.order.Sort,
+ }
+ }
var seriesList tsdb.SeriesList
for _, e := range i.entities {
shards, errInternal := ec.Shards(e)
@@ -130,11 +137,16 @@ func (i *localIndexScan) Execute(ec
executor.MeasureExecutionContext) (mit execu
return nil, errInternal
}
for _, shard := range shards {
- sl, errInternal :=
shard.Series().List(context.WithValue(
- context.Background(),
- logger.ContextKey,
- i.l,
- ), tsdb.NewPath(e))
+ sl, errInternal := shard.Series().Search(
+ context.WithValue(
+ context.Background(),
+ logger.ContextKey,
+ i.l,
+ ),
+ tsdb.NewPath(e),
+ i.filter,
+ orderBy,
+ )
if errInternal != nil {
return nil, errInternal
}
@@ -145,20 +157,12 @@ func (i *localIndexScan) Execute(ec
executor.MeasureExecutionContext) (mit execu
return dummyIter, nil
}
var builders []logical.SeekerBuilder
- if i.order.Index != nil {
- builders = append(builders, func(builder tsdb.SeekerBuilder) {
- builder.OrderByIndex(i.order.Index, i.order.Sort)
- })
- } else {
+ if i.order.Index == nil {
builders = append(builders, func(builder tsdb.SeekerBuilder) {
builder.OrderByTime(i.order.Sort)
})
}
- if i.filter != nil {
- builders = append(builders, func(b tsdb.SeekerBuilder) {
- b.Filter(i.filter)
- })
- }
+ // CAVEAT: the order of series list matters when sorting by an index.
iters, closers, err := logical.ExecuteForShard(i.l, seriesList,
i.timeRange, builders...)
if err != nil {
return nil, err
diff --git a/test/cases/measure/data/input/bottom.yaml
b/test/cases/measure/data/input/bottom.yaml
index 4aee3650..0cc0e4c2 100644
--- a/test/cases/measure/data/input/bottom.yaml
+++ b/test/cases/measure/data/input/bottom.yaml
@@ -21,14 +21,14 @@ metadata:
tagProjection:
tagFamilies:
- name: "default"
- tags: ["entity_id"]
+ tags: ["id"]
fieldProjection:
names: ["total", "value"]
groupBy:
tagProjection:
tagFamilies:
- name: "default"
- tags: ["entity_id"]
+ tags: ["id"]
fieldName: "value"
agg:
function: "AGGREGATION_FUNCTION_MEAN"
diff --git a/test/cases/measure/data/input/group_max.yaml
b/test/cases/measure/data/input/group_max.yaml
index 80e7dd4a..8287303b 100644
--- a/test/cases/measure/data/input/group_max.yaml
+++ b/test/cases/measure/data/input/group_max.yaml
@@ -21,14 +21,14 @@ metadata:
tagProjection:
tagFamilies:
- name: "default"
- tags: ["entity_id"]
+ tags: ["id"]
fieldProjection:
names: ["total", "value"]
groupBy:
tagProjection:
tagFamilies:
- name: "default"
- tags: ["entity_id"]
+ tags: ["id"]
fieldName: "value"
agg:
function: "AGGREGATION_FUNCTION_MAX"
diff --git a/test/cases/measure/data/input/group_no_field.yaml
b/test/cases/measure/data/input/group_no_field.yaml
index 7ae6d120..b9632f78 100644
--- a/test/cases/measure/data/input/group_no_field.yaml
+++ b/test/cases/measure/data/input/group_no_field.yaml
@@ -21,10 +21,10 @@ metadata:
tagProjection:
tagFamilies:
- name: "default"
- tags: ["entity_id"]
+ tags: ["id"]
groupBy:
tagProjection:
tagFamilies:
- name: "default"
- tags: ["entity_id"]
+ tags: ["id"]
diff --git a/test/cases/measure/data/input/in.yaml
b/test/cases/measure/data/input/in.yaml
index 7dcef0db..7b0fe828 100644
--- a/test/cases/measure/data/input/in.yaml
+++ b/test/cases/measure/data/input/in.yaml
@@ -26,8 +26,8 @@ fieldProjection:
names: ["total", "value"]
criteria:
condition:
- name: "id"
+ name: "entity_id"
op: "BINARY_OP_IN"
value:
str_array:
- value: ["4", "5", "unknown"]
+ value: ["entity_4", "entity_5", "unknown"]
diff --git a/test/cases/measure/data/input/linked_or.yaml
b/test/cases/measure/data/input/linked_or.yaml
index 6d0b3b4e..bf9d90ad 100644
--- a/test/cases/measure/data/input/linked_or.yaml
+++ b/test/cases/measure/data/input/linked_or.yaml
@@ -29,27 +29,27 @@ criteria:
op: "LOGICAL_OP_OR"
left:
condition:
- name: "id"
+ name: "entity_id"
op: "BINARY_OP_EQ"
value:
str:
- value: "4"
+ value: "entity_4"
right:
le:
op: "LOGICAL_OP_OR"
left:
condition:
- name: "id"
+ name: "entity_id"
op: "BINARY_OP_EQ"
value:
str:
- value: "5"
+ value: "entity_5"
right:
le:
op: "LOGICAL_OP_OR"
left:
condition:
- name: "id"
+ name: "entity_id"
op: "BINARY_OP_EQ"
value:
str:
diff --git a/test/cases/measure/data/input/tag_filter.yaml
b/test/cases/measure/data/input/order_tag_asc.yaml
similarity index 90%
copy from test/cases/measure/data/input/tag_filter.yaml
copy to test/cases/measure/data/input/order_tag_asc.yaml
index d5a48980..c5b1f1bd 100644
--- a/test/cases/measure/data/input/tag_filter.yaml
+++ b/test/cases/measure/data/input/order_tag_asc.yaml
@@ -24,10 +24,6 @@ tagProjection:
tags: ["id"]
fieldProjection:
names: ["total", "value"]
-criteria:
- condition:
- name: "id"
- op: "BINARY_OP_EQ"
- value:
- str:
- value: "1"
+orderBy:
+ sort: "SORT_ASC"
+ indexRuleName: "id"
diff --git a/test/cases/measure/data/input/tag_filter.yaml
b/test/cases/measure/data/input/order_tag_desc.yaml
similarity index 90%
copy from test/cases/measure/data/input/tag_filter.yaml
copy to test/cases/measure/data/input/order_tag_desc.yaml
index d5a48980..6031cdb3 100644
--- a/test/cases/measure/data/input/tag_filter.yaml
+++ b/test/cases/measure/data/input/order_tag_desc.yaml
@@ -24,10 +24,6 @@ tagProjection:
tags: ["id"]
fieldProjection:
names: ["total", "value"]
-criteria:
- condition:
- name: "id"
- op: "BINARY_OP_EQ"
- value:
- str:
- value: "1"
+orderBy:
+ sort: "SORT_DESC"
+ indexRuleName: "id"
diff --git a/test/cases/measure/data/input/tag_filter.yaml
b/test/cases/measure/data/input/tag_filter.yaml
index d5a48980..b5481e8f 100644
--- a/test/cases/measure/data/input/tag_filter.yaml
+++ b/test/cases/measure/data/input/tag_filter.yaml
@@ -30,4 +30,4 @@ criteria:
op: "BINARY_OP_EQ"
value:
str:
- value: "1"
+ value: "svc1"
diff --git a/test/cases/measure/data/input/top.yaml
b/test/cases/measure/data/input/top.yaml
index c103d033..5d66f2dc 100644
--- a/test/cases/measure/data/input/top.yaml
+++ b/test/cases/measure/data/input/top.yaml
@@ -21,14 +21,14 @@ metadata:
tagProjection:
tagFamilies:
- name: "default"
- tags: ["entity_id"]
+ tags: ["id"]
fieldProjection:
names: ["value"]
groupBy:
tagProjection:
tagFamilies:
- name: "default"
- tags: ["entity_id"]
+ tags: ["id"]
fieldName: "value"
agg:
function: "AGGREGATION_FUNCTION_MEAN"
diff --git a/test/cases/measure/data/testdata/service_cpm_minute_data.json
b/test/cases/measure/data/testdata/service_cpm_minute_data.json
index 82d4203d..5dc3808a 100644
--- a/test/cases/measure/data/testdata/service_cpm_minute_data.json
+++ b/test/cases/measure/data/testdata/service_cpm_minute_data.json
@@ -5,7 +5,7 @@
"tags": [
{
"str": {
- "value": "1"
+ "value": "svc1"
}
},
{
@@ -35,7 +35,7 @@
"tags": [
{
"str": {
- "value": "4"
+ "value": "svc1"
}
},
{
@@ -65,12 +65,12 @@
"tags": [
{
"str": {
- "value": "5"
+ "value": "svc1"
}
},
{
"str": {
- "value": "entity_2"
+ "value": "entity_3"
}
}
]
@@ -95,12 +95,12 @@
"tags": [
{
"str": {
- "value": "6"
+ "value": "svc2"
}
},
{
"str": {
- "value": "entity_3"
+ "value": "entity_4"
}
}
]
@@ -125,12 +125,12 @@
"tags": [
{
"str": {
- "value": "2"
+ "value": "svc2"
}
},
{
"str": {
- "value": "entity_1"
+ "value": "entity_5"
}
}
]
@@ -155,12 +155,12 @@
"tags": [
{
"str": {
- "value": "3"
+ "value": "svc3"
}
},
{
"str": {
- "value": "entity_1"
+ "value": "entity_6"
}
}
]
diff --git a/test/cases/measure/data/testdata/service_cpm_minute_data1.json
b/test/cases/measure/data/testdata/service_cpm_minute_data1.json
index 7ba3cd2b..e7567d71 100644
--- a/test/cases/measure/data/testdata/service_cpm_minute_data1.json
+++ b/test/cases/measure/data/testdata/service_cpm_minute_data1.json
@@ -5,12 +5,12 @@
"tags": [
{
"str": {
- "value": "7"
+ "value": "svc1"
}
},
{
"str": {
- "value": "entity_2"
+ "value": "entity_1"
}
}
]
@@ -19,12 +19,12 @@
"fields": [
{
"int": {
- "value": 100
+ "value": 200
}
},
{
"int": {
- "value": 10
+ "value": 2
}
}
]
@@ -35,7 +35,7 @@
"tags": [
{
"str": {
- "value": "8"
+ "value": "svc1"
}
},
{
@@ -49,12 +49,12 @@
"fields": [
{
"int": {
- "value": 100
+ "value": 200
}
},
{
"int": {
- "value": 9
+ "value": 3
}
}
]
@@ -65,12 +65,12 @@
"tags": [
{
"str": {
- "value": "9"
+ "value": "svc1"
}
},
{
"str": {
- "value": "entity_2"
+ "value": "entity_3"
}
}
]
@@ -79,12 +79,12 @@
"fields": [
{
"int": {
- "value": 100
+ "value": 200
}
},
{
"int": {
- "value": 8
+ "value": 4
}
}
]
@@ -95,12 +95,12 @@
"tags": [
{
"str": {
- "value": "10"
+ "value": "svc2"
}
},
{
"str": {
- "value": "entity_3"
+ "value": "entity_4"
}
}
]
@@ -109,12 +109,12 @@
"fields": [
{
"int": {
- "value": 100
+ "value": 200
}
},
{
"int": {
- "value": 11
+ "value": 6
}
}
]
@@ -125,12 +125,12 @@
"tags": [
{
"str": {
- "value": "11"
+ "value": "svc2"
}
},
{
"str": {
- "value": "entity_1"
+ "value": "entity_5"
}
}
]
@@ -139,12 +139,12 @@
"fields": [
{
"int": {
- "value": 50
+ "value": 60
}
},
{
"int": {
- "value": 12
+ "value": 5
}
}
]
@@ -155,12 +155,12 @@
"tags": [
{
"str": {
- "value": "12"
+ "value": "svc3"
}
},
{
"str": {
- "value": "entity_1"
+ "value": "entity_6"
}
}
]
@@ -169,7 +169,7 @@
"fields": [
{
"int": {
- "value": 300
+ "value": 400
}
},
{
diff --git a/test/cases/measure/data/testdata/service_cpm_minute_data2.json
b/test/cases/measure/data/testdata/service_cpm_minute_data2.json
deleted file mode 100644
index 94dcf8ec..00000000
--- a/test/cases/measure/data/testdata/service_cpm_minute_data2.json
+++ /dev/null
@@ -1,62 +0,0 @@
-[
- {
- "tag_families": [
- {
- "tags": [
- {
- "str": {
- "value": "100"
- }
- },
- {
- "str": {
- "value": "entity_2"
- }
- }
- ]
- }
- ],
- "fields": [
- {
- "int": {
- "value": 100
- }
- },
- {
- "int": {
- "value": 100
- }
- }
- ]
- },
- {
- "tag_families": [
- {
- "tags": [
- {
- "str": {
- "value": "110"
- }
- },
- {
- "str": {
- "value": "entity_2"
- }
- }
- ]
- }
- ],
- "fields": [
- {
- "int": {
- "value": 100
- }
- },
- {
- "int": {
- "value": 110
- }
- }
- ]
- }
-]
diff --git a/test/cases/measure/data/want/all.yaml
b/test/cases/measure/data/want/all.yaml
index 1e9612e1..00b18290 100644
--- a/test/cases/measure/data/want/all.yaml
+++ b/test/cases/measure/data/want/all.yaml
@@ -31,33 +31,12 @@ dataPoints:
- key: id
value:
str:
- value: "1"
+ value: svc1
- key: entity_id
value:
str:
value: entity_1
- timestamp: "2022-10-17T12:49:45.912Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "10"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "7"
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:49:46.912Z"
+ timestamp: "2023-06-25T23:26:00Z"
- fields:
- name: total
value:
@@ -73,33 +52,12 @@ dataPoints:
- key: id
value:
str:
- value: "4"
+ value: svc1
- key: entity_id
value:
str:
value: entity_2
- timestamp: "2022-10-17T12:50:45.912Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "9"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "8"
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:50:46.912Z"
+ timestamp: "2023-06-25T23:27:00Z"
- fields:
- name: total
value:
@@ -115,54 +73,12 @@ dataPoints:
- key: id
value:
str:
- value: "5"
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:51:45.912Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "8"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "9"
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:51:46.912Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "5"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "6"
+ value: svc1
- key: entity_id
value:
str:
value: entity_3
- timestamp: "2022-10-17T12:52:45.912Z"
+ timestamp: "2023-06-25T23:28:00Z"
- fields:
- name: total
value:
@@ -171,19 +87,19 @@ dataPoints:
- name: value
value:
int:
- value: "11"
+ value: "5"
tagFamilies:
- name: default
tags:
- key: id
value:
str:
- value: "10"
+ value: svc2
- key: entity_id
value:
str:
- value: entity_3
- timestamp: "2022-10-17T12:52:46.912Z"
+ value: entity_4
+ timestamp: "2023-06-25T23:29:00Z"
- fields:
- name: total
value:
@@ -199,33 +115,12 @@ dataPoints:
- key: id
value:
str:
- value: "2"
- - key: entity_id
- value:
- str:
- value: entity_1
- timestamp: "2022-10-17T12:53:45.912Z"
-- fields:
- - name: total
- value:
- int:
- value: "50"
- - name: value
- value:
- int:
- value: "12"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "11"
+ value: svc2
- key: entity_id
value:
str:
- value: entity_1
- timestamp: "2022-10-17T12:53:46.912Z"
+ value: entity_5
+ timestamp: "2023-06-25T23:30:00Z"
- fields:
- name: total
value:
@@ -241,30 +136,9 @@ dataPoints:
- key: id
value:
str:
- value: "3"
- - key: entity_id
- value:
- str:
- value: entity_1
- timestamp: "2022-10-17T12:54:45.912Z"
-- fields:
- - name: total
- value:
- int:
- value: "300"
- - name: value
- value:
- int:
- value: "7"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "12"
+ value: svc3
- key: entity_id
value:
str:
- value: entity_1
- timestamp: "2022-10-17T12:54:46.912Z"
+ value: entity_6
+ timestamp: "2023-06-25T23:31:00Z"
diff --git a/test/cases/measure/data/want/bottom.yaml
b/test/cases/measure/data/want/bottom.yaml
index 760d5a73..3c86cefe 100644
--- a/test/cases/measure/data/want/bottom.yaml
+++ b/test/cases/measure/data/want/bottom.yaml
@@ -20,23 +20,23 @@ dataPoints:
- name: value
value:
int:
- value: "6"
+ value: "2"
tagFamilies:
- name: default
tags:
- - key: entity_id
+ - key: id
value:
str:
- value: entity_2
+ value: svc1
- fields:
- name: value
value:
int:
- value: "6"
+ value: "4"
tagFamilies:
- name: default
tags:
- - key: entity_id
+ - key: id
value:
str:
- value: entity_1
\ No newline at end of file
+ value: svc2
diff --git a/test/cases/measure/data/want/group_max.yaml
b/test/cases/measure/data/want/group_max.yaml
index bbe39234..5bf44e0e 100644
--- a/test/cases/measure/data/want/group_max.yaml
+++ b/test/cases/measure/data/want/group_max.yaml
@@ -20,35 +20,35 @@ dataPoints:
- name: value
value:
int:
- value: "12"
+ value: "3"
tagFamilies:
- name: default
tags:
- - key: entity_id
+ - key: id
value:
str:
- value: entity_1
+ value: svc1
- fields:
- name: value
value:
int:
- value: "10"
+ value: "5"
tagFamilies:
- name: default
tags:
- - key: entity_id
+ - key: id
value:
str:
- value: entity_2
+ value: svc2
- fields:
- name: value
value:
int:
- value: "11"
+ value: "6"
tagFamilies:
- name: default
tags:
- - key: entity_id
+ - key: id
value:
str:
- value: entity_3
\ No newline at end of file
+ value: svc3
\ No newline at end of file
diff --git a/test/cases/measure/data/want/group_no_field.yaml
b/test/cases/measure/data/want/group_no_field.yaml
index b506f875..572750b3 100644
--- a/test/cases/measure/data/want/group_no_field.yaml
+++ b/test/cases/measure/data/want/group_no_field.yaml
@@ -16,24 +16,27 @@
# under the License.
dataPoints:
- - tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_1
- - tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_2
- - tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_3
\ No newline at end of file
+- tagFamilies:
+ - name: default
+ tags:
+ - key: id
+ value:
+ str:
+ value: svc1
+ timestamp: "2023-06-25T23:51:00Z"
+- tagFamilies:
+ - name: default
+ tags:
+ - key: id
+ value:
+ str:
+ value: svc2
+ timestamp: "2023-06-25T23:54:00Z"
+- tagFamilies:
+ - name: default
+ tags:
+ - key: id
+ value:
+ str:
+ value: svc3
+ timestamp: "2023-06-25T23:56:00Z"
\ No newline at end of file
diff --git a/test/cases/measure/data/want/in.yaml
b/test/cases/measure/data/want/in.yaml
index cc339b74..c4d58638 100644
--- a/test/cases/measure/data/want/in.yaml
+++ b/test/cases/measure/data/want/in.yaml
@@ -24,37 +24,37 @@ dataPoints:
- name: value
value:
int:
- value: "2"
+ value: "5"
tagFamilies:
- name: default
tags:
- key: id
value:
str:
- value: "4"
+ value: svc2
- key: entity_id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:50:45.912Z"
+ value: entity_4
+ timestamp: "2023-06-26T01:38:00Z"
- fields:
- name: total
value:
int:
- value: "100"
+ value: "50"
- name: value
value:
int:
- value: "3"
+ value: "4"
tagFamilies:
- name: default
tags:
- key: id
value:
str:
- value: "5"
+ value: svc2
- key: entity_id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:51:45.912Z"
+ value: entity_5
+ timestamp: "2023-06-26T01:39:00Z"
diff --git a/test/cases/measure/data/want/limit.yaml
b/test/cases/measure/data/want/limit.yaml
index ca93ea1f..103a8c5d 100644
--- a/test/cases/measure/data/want/limit.yaml
+++ b/test/cases/measure/data/want/limit.yaml
@@ -24,29 +24,29 @@ dataPoints:
- name: value
value:
int:
- value: "9"
+ value: "5"
tagFamilies:
- name: default
tags:
- key: entity_id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:57:03.444Z"
+ value: entity_4
+ timestamp: "2023-06-26T01:01:00Z"
- fields:
- name: total
value:
int:
- value: "100"
+ value: "50"
- name: value
value:
int:
- value: "3"
+ value: "4"
tagFamilies:
- name: default
tags:
- key: entity_id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:58:02.444Z"
\ No newline at end of file
+ value: entity_5
+ timestamp: "2023-06-26T01:02:00Z"
\ No newline at end of file
diff --git a/test/cases/measure/data/want/linked_or.yaml
b/test/cases/measure/data/want/linked_or.yaml
index cc339b74..9de74079 100644
--- a/test/cases/measure/data/want/linked_or.yaml
+++ b/test/cases/measure/data/want/linked_or.yaml
@@ -24,37 +24,37 @@ dataPoints:
- name: value
value:
int:
- value: "2"
+ value: "5"
tagFamilies:
- name: default
tags:
- key: id
value:
str:
- value: "4"
+ value: svc2
- key: entity_id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:50:45.912Z"
+ value: entity_4
+ timestamp: "2023-06-26T01:35:00Z"
- fields:
- name: total
value:
int:
- value: "100"
+ value: "50"
- name: value
value:
int:
- value: "3"
+ value: "4"
tagFamilies:
- name: default
tags:
- key: id
value:
str:
- value: "5"
+ value: svc2
- key: entity_id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:51:45.912Z"
+ value: entity_5
+ timestamp: "2023-06-26T01:36:00Z"
diff --git a/test/cases/measure/data/want/order_asc.yaml
b/test/cases/measure/data/want/order_asc.yaml
index d55db5e0..0c6e0394 100644
--- a/test/cases/measure/data/want/order_asc.yaml
+++ b/test/cases/measure/data/want/order_asc.yaml
@@ -32,24 +32,7 @@ dataPoints:
value:
str:
value: entity_1
- timestamp: "2022-10-17T12:54:36.627Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "10"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:54:37.627Z"
+ timestamp: "2023-06-26T00:31:00Z"
- fields:
- name: total
value:
@@ -66,24 +49,7 @@ dataPoints:
value:
str:
value: entity_2
- timestamp: "2022-10-17T12:55:36.627Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "9"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:55:37.627Z"
+ timestamp: "2023-06-26T00:32:00Z"
- fields:
- name: total
value:
@@ -94,47 +60,13 @@ dataPoints:
int:
value: "3"
tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:56:36.627Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "8"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:56:37.627Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "5"
- tagFamilies:
- name: default
tags:
- key: entity_id
value:
str:
value: entity_3
- timestamp: "2022-10-17T12:57:36.627Z"
+ timestamp: "2023-06-26T00:33:00Z"
- fields:
- name: total
value:
@@ -143,15 +75,15 @@ dataPoints:
- name: value
value:
int:
- value: "11"
+ value: "5"
tagFamilies:
- name: default
tags:
- key: entity_id
value:
str:
- value: entity_3
- timestamp: "2022-10-17T12:57:37.627Z"
+ value: entity_4
+ timestamp: "2023-06-26T00:34:00Z"
- fields:
- name: total
value:
@@ -167,25 +99,8 @@ dataPoints:
- key: entity_id
value:
str:
- value: entity_1
- timestamp: "2022-10-17T12:58:36.627Z"
-- fields:
- - name: total
- value:
- int:
- value: "50"
- - name: value
- value:
- int:
- value: "12"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_1
- timestamp: "2022-10-17T12:58:37.627Z"
+ value: entity_5
+ timestamp: "2023-06-26T00:35:00Z"
- fields:
- name: total
value:
@@ -201,22 +116,5 @@ dataPoints:
- key: entity_id
value:
str:
- value: entity_1
- timestamp: "2022-10-17T12:59:36.627Z"
-- fields:
- - name: total
- value:
- int:
- value: "300"
- - name: value
- value:
- int:
- value: "7"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_1
- timestamp: "2022-10-17T12:59:37.627Z"
\ No newline at end of file
+ value: entity_6
+ timestamp: "2023-06-26T00:36:00Z"
diff --git a/test/cases/measure/data/want/order_desc.yaml
b/test/cases/measure/data/want/order_desc.yaml
index 4c4f749e..cd41c5dc 100644
--- a/test/cases/measure/data/want/order_desc.yaml
+++ b/test/cases/measure/data/want/order_desc.yaml
@@ -16,23 +16,6 @@
# under the License.
dataPoints:
-- fields:
- - name: total
- value:
- int:
- value: "300"
- - name: value
- value:
- int:
- value: "7"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_1
- timestamp: "2022-10-17T13:01:03.444Z"
- fields:
- name: total
value:
@@ -48,25 +31,8 @@ dataPoints:
- key: entity_id
value:
str:
- value: entity_1
- timestamp: "2022-10-17T13:01:02.444Z"
-- fields:
- - name: total
- value:
- int:
- value: "50"
- - name: value
- value:
- int:
- value: "12"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_1
- timestamp: "2022-10-17T13:00:03.444Z"
+ value: entity_6
+ timestamp: "2023-06-26T00:59:00Z"
- fields:
- name: total
value:
@@ -82,25 +48,8 @@ dataPoints:
- key: entity_id
value:
str:
- value: entity_1
- timestamp: "2022-10-17T13:00:02.444Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "11"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_3
- timestamp: "2022-10-17T12:59:03.444Z"
+ value: entity_5
+ timestamp: "2023-06-26T00:58:00Z"
- fields:
- name: total
value:
@@ -116,25 +65,8 @@ dataPoints:
- key: entity_id
value:
str:
- value: entity_3
- timestamp: "2022-10-17T12:59:02.444Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "8"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:58:03.444Z"
+ value: entity_4
+ timestamp: "2023-06-26T00:57:00Z"
- fields:
- name: total
value:
@@ -150,25 +82,8 @@ dataPoints:
- key: entity_id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:58:02.444Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "9"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:57:03.444Z"
+ value: entity_3
+ timestamp: "2023-06-26T00:56:00Z"
- fields:
- name: total
value:
@@ -185,24 +100,7 @@ dataPoints:
value:
str:
value: entity_2
- timestamp: "2022-10-17T12:57:02.444Z"
-- fields:
- - name: total
- value:
- int:
- value: "100"
- - name: value
- value:
- int:
- value: "10"
- tagFamilies:
- - name: default
- tags:
- - key: entity_id
- value:
- str:
- value: entity_2
- timestamp: "2022-10-17T12:56:03.444Z"
+ timestamp: "2023-06-26T00:55:00Z"
- fields:
- name: total
value:
@@ -219,4 +117,4 @@ dataPoints:
value:
str:
value: entity_1
- timestamp: "2022-10-17T12:56:02.444Z"
\ No newline at end of file
+ timestamp: "2023-06-26T00:54:00Z"
diff --git a/test/cases/measure/data/want/in.yaml
b/test/cases/measure/data/want/order_tag_asc.yaml
similarity index 53%
copy from test/cases/measure/data/want/in.yaml
copy to test/cases/measure/data/want/order_tag_asc.yaml
index cc339b74..b6a59101 100644
--- a/test/cases/measure/data/want/in.yaml
+++ b/test/cases/measure/data/want/order_tag_asc.yaml
@@ -24,19 +24,32 @@ dataPoints:
- name: value
value:
int:
- value: "2"
+ value: "1"
tagFamilies:
- name: default
tags:
- key: id
value:
str:
- value: "4"
- - key: entity_id
+ value: svc1
+ timestamp: "2023-06-26T12:41:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "100"
+ - name: value
+ value:
+ int:
+ value: "2"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:50:45.912Z"
+ value: svc1
+ timestamp: "2023-06-26T12:42:00Z"
- fields:
- name: total
value:
@@ -52,9 +65,56 @@ dataPoints:
- key: id
value:
str:
- value: "5"
- - key: entity_id
+ value: svc1
+ timestamp: "2023-06-26T12:43:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "100"
+ - name: value
+ value:
+ int:
+ value: "5"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
+ value:
+ str:
+ value: svc2
+ timestamp: "2023-06-26T12:44:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "50"
+ - name: value
+ value:
+ int:
+ value: "4"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
+ value:
+ str:
+ value: svc2
+ timestamp: "2023-06-26T12:45:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "300"
+ - name: value
+ value:
+ int:
+ value: "6"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:51:45.912Z"
+ value: svc3
+ timestamp: "2023-06-26T12:46:00Z"
diff --git a/test/cases/measure/data/want/in.yaml
b/test/cases/measure/data/want/order_tag_desc.yaml
similarity index 53%
copy from test/cases/measure/data/want/in.yaml
copy to test/cases/measure/data/want/order_tag_desc.yaml
index cc339b74..db711266 100644
--- a/test/cases/measure/data/want/in.yaml
+++ b/test/cases/measure/data/want/order_tag_desc.yaml
@@ -20,23 +20,53 @@ dataPoints:
- name: total
value:
int:
- value: "100"
+ value: "300"
- name: value
value:
int:
- value: "2"
+ value: "6"
tagFamilies:
- name: default
tags:
- key: id
value:
str:
- value: "4"
- - key: entity_id
+ value: svc3
+ timestamp: "2023-06-26T12:47:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "50"
+ - name: value
+ value:
+ int:
+ value: "4"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
+ value:
+ str:
+ value: svc2
+ timestamp: "2023-06-26T12:46:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "100"
+ - name: value
+ value:
+ int:
+ value: "5"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:50:45.912Z"
+ value: svc2
+ timestamp: "2023-06-26T12:45:00Z"
- fields:
- name: total
value:
@@ -52,9 +82,39 @@ dataPoints:
- key: id
value:
str:
- value: "5"
- - key: entity_id
+ value: svc1
+ timestamp: "2023-06-26T12:44:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "100"
+ - name: value
+ value:
+ int:
+ value: "2"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
+ value:
+ str:
+ value: svc1
+ timestamp: "2023-06-26T12:43:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "100"
+ - name: value
+ value:
+ int:
+ value: "1"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
str:
- value: entity_2
- timestamp: "2022-10-17T12:51:45.912Z"
+ value: svc1
+ timestamp: "2023-06-26T12:42:00Z"
diff --git a/test/cases/measure/data/want/tag_filter.yaml
b/test/cases/measure/data/want/tag_filter.yaml
index a588ad4a..333859af 100644
--- a/test/cases/measure/data/want/tag_filter.yaml
+++ b/test/cases/measure/data/want/tag_filter.yaml
@@ -16,19 +16,54 @@
# under the License.
dataPoints:
- - fields:
- - name: total
+- fields:
+ - name: total
+ value:
+ int:
+ value: "100"
+ - name: value
+ value:
+ int:
+ value: "1"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
- int:
- value: "100"
- - name: value
+ str:
+ value: svc1
+ timestamp: "2023-06-25T23:33:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "100"
+ - name: value
+ value:
+ int:
+ value: "2"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
- int:
- value: "1"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "1"
\ No newline at end of file
+ str:
+ value: svc1
+ timestamp: "2023-06-25T23:34:00Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "100"
+ - name: value
+ value:
+ int:
+ value: "3"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
+ value:
+ str:
+ value: svc1
+ timestamp: "2023-06-25T23:35:00Z"
\ No newline at end of file
diff --git a/test/cases/measure/data/want/top.yaml
b/test/cases/measure/data/want/top.yaml
index ac6d57cc..972adee0 100644
--- a/test/cases/measure/data/want/top.yaml
+++ b/test/cases/measure/data/want/top.yaml
@@ -20,23 +20,23 @@ dataPoints:
- name: value
value:
int:
- value: "8"
+ value: "6"
tagFamilies:
- name: default
tags:
- - key: entity_id
+ - key: id
value:
str:
- value: entity_3
+ value: svc3
- fields:
- name: value
value:
int:
- value: "6"
+ value: "4"
tagFamilies:
- name: default
tags:
- - key: entity_id
+ - key: id
value:
str:
- value: entity_2
\ No newline at end of file
+ value: svc2
\ No newline at end of file
diff --git a/test/cases/measure/data/want/update.yaml
b/test/cases/measure/data/want/update.yaml
index ee0f55d1..9bf60003 100644
--- a/test/cases/measure/data/want/update.yaml
+++ b/test/cases/measure/data/want/update.yaml
@@ -16,123 +16,129 @@
# under the License.
dataPoints:
- - fields:
- - name: total
+- fields:
+ - name: total
+ value:
+ int:
+ value: "200"
+ - name: value
+ value:
+ int:
+ value: "2"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
- int:
- value: "200"
- - name: value
+ str:
+ value: svc1
+ - key: entity_id
value:
- int:
- value: "3"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "1"
- - key: entity_id
- value:
- str:
- value: entity_1
- - fields:
- - name: total
+ str:
+ value: entity_1
+ timestamp: "2023-06-26T04:49:57.500Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "200"
+ - name: value
+ value:
+ int:
+ value: "3"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
- int:
- value: "100"
- - name: value
+ str:
+ value: svc1
+ - key: entity_id
value:
- int:
- value: "1"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "4"
- - key: entity_id
- value:
- str:
- value: entity_2
- - fields:
- - name: total
+ str:
+ value: entity_2
+ timestamp: "2023-06-26T04:49:58Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "200"
+ - name: value
+ value:
+ int:
+ value: "4"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
- int:
- value: "100"
- - name: value
+ str:
+ value: svc1
+ - key: entity_id
value:
- int:
- value: "1"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "5"
- - key: entity_id
- value:
- str:
- value: entity_2
- - fields:
- - name: total
+ str:
+ value: entity_3
+ timestamp: "2023-06-26T04:49:58.500Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "200"
+ - name: value
+ value:
+ int:
+ value: "6"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
- int:
- value: "100"
- - name: value
+ str:
+ value: svc2
+ - key: entity_id
value:
- int:
- value: "5"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "6"
- - key: entity_id
- value:
- str:
- value: entity_3
- - fields:
- - name: total
+ str:
+ value: entity_4
+ timestamp: "2023-06-26T04:49:59Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "60"
+ - name: value
+ value:
+ int:
+ value: "5"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
- int:
- value: "50"
- - name: value
+ str:
+ value: svc2
+ - key: entity_id
value:
- int:
- value: "4"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "2"
- - key: entity_id
- value:
- str:
- value: entity_1
- - fields:
- - name: total
+ str:
+ value: entity_5
+ timestamp: "2023-06-26T04:49:59.500Z"
+- fields:
+ - name: total
+ value:
+ int:
+ value: "400"
+ - name: value
+ value:
+ int:
+ value: "7"
+ tagFamilies:
+ - name: default
+ tags:
+ - key: id
value:
- int:
- value: "300"
- - name: value
+ str:
+ value: svc3
+ - key: entity_id
value:
- int:
- value: "5"
- tagFamilies:
- - name: default
- tags:
- - key: id
- value:
- str:
- value: "3"
- - key: entity_id
- value:
- str:
- value: entity_1
\ No newline at end of file
+ str:
+ value: entity_6
+ timestamp: "2023-06-26T04:50:00Z"
diff --git a/test/cases/measure/measure.go b/test/cases/measure/measure.go
index 4db0b05d..c2a43223 100644
--- a/test/cases/measure/measure.go
+++ b/test/cases/measure/measure.go
@@ -51,6 +51,8 @@ var _ = g.DescribeTable("Scanning Measures", verify,
g.Entry("bottom 2", helpers.Args{Input: "bottom", Duration: 25 *
time.Minute, Offset: -20 * time.Minute}),
g.Entry("order by time asc", helpers.Args{Input: "order_asc", Duration:
25 * time.Minute, Offset: -20 * time.Minute}),
g.Entry("order by time desc", helpers.Args{Input: "order_desc",
Duration: 25 * time.Minute, Offset: -20 * time.Minute}),
+ g.Entry("order by tag asc", helpers.Args{Input: "order_tag_asc",
Duration: 25 * time.Minute, Offset: -20 * time.Minute}),
+ g.Entry("order by tag desc", helpers.Args{Input: "order_tag_desc",
Duration: 25 * time.Minute, Offset: -20 * time.Minute}),
g.Entry("limit 3,2", helpers.Args{Input: "limit", Duration: 25 *
time.Minute, Offset: -20 * time.Minute}),
g.Entry("match a node", helpers.Args{Input: "match_node", Duration: 25
* time.Minute, Offset: -20 * time.Minute}),
g.Entry("match nodes", helpers.Args{Input: "match_nodes", Duration: 25
* time.Minute, Offset: -20 * time.Minute}),
diff --git a/test/e2e-v2/script/env b/test/e2e-v2/script/env
index 52d79dc8..57dc048e 100644
--- a/test/e2e-v2/script/env
+++ b/test/e2e-v2/script/env
@@ -21,9 +21,9 @@ SW_AGENT_GO_COMMIT=4af380c2db6243106b0fc650b6003ce3b3eb82a0
SW_AGENT_PYTHON_COMMIT=c76a6ec51a478ac91abb20ec8f22a99b8d4d6a58
SW_AGENT_CLIENT_JS_COMMIT=af0565a67d382b683c1dbd94c379b7080db61449
SW_AGENT_CLIENT_JS_TEST_COMMIT=4f1eb1dcdbde3ec4a38534bf01dded4ab5d2f016
-SW_KUBERNETES_COMMIT_SHA=b670c41d94a82ddefcf466d54bab5c492d88d772
+SW_KUBERNETES_COMMIT_SHA=e2c61c6774cf377b23516fca6f8a1e119d3191c5
SW_ROVER_COMMIT=fc8d074c6d34ecfee585a7097cbd5aef1ca680a5
-SW_CTL_COMMIT=23debb3b77426edd70192095a5fe9b0fc9031068
+SW_CTL_COMMIT=6b2eb0011e38b630db6af7203db215806bd141ed
-SW_OAP_COMMIT=0664bcdcb4bbf9e37ed3d497ed28e527d40bd819
+SW_OAP_COMMIT=5ad74eb2619b4cebe57a150ca328b2c1d052cb54
SW_AGENT_E2E_SERVICE_PROVIDER_COMMIT=cc7a2c9e97fd2c421adbe3e9c471688459a446d9
diff --git a/test/integration/cold_query/query_suite_test.go
b/test/integration/cold_query/query_suite_test.go
index 0319b5f5..9f3c16df 100644
--- a/test/integration/cold_query/query_suite_test.go
+++ b/test/integration/cold_query/query_suite_test.go
@@ -73,8 +73,6 @@ var _ = SynchronizedBeforeSuite(func() []byte {
casesmeasureData.Write(conn, "service_traffic", "sw_metric",
"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, "service_cpm_minute", "sw_metric",
"service_cpm_minute_data1.json", now.Add(10*time.Second), interval)
- casesmeasureData.Write(conn, "service_cpm_minute", "sw_metric",
"service_cpm_minute_data2.json", now.Add(10*time.Minute), interval)
casesmeasureData.Write(conn, "instance_clr_cpu_minute", "sw_metric",
"instance_clr_cpu_minute_data.json", now, interval)
casesmeasureData.Write(conn, "service_instance_cpm_minute",
"sw_metric", "service_instance_cpm_minute_data.json", now, interval)
casesmeasureData.Write(conn, "service_instance_cpm_minute",
"sw_metric", "service_instance_cpm_minute_data1.json", now.Add(10*time.Second),
interval)
diff --git a/test/integration/other/measure_test.go
b/test/integration/other/measure_test.go
index 1df0b041..24800b19 100644
--- a/test/integration/other/measure_test.go
+++ b/test/integration/other/measure_test.go
@@ -49,7 +49,8 @@ var _ = g.Describe("Query service_cpm_minute", func() {
var err error
conn, err = grpchelper.Conn(addr, 10*time.Second,
grpc.WithTransportCredentials(insecure.NewCredentials()))
gm.Expect(err).NotTo(gm.HaveOccurred())
- baseTime = timestamp.NowMilli()
+ ns := timestamp.NowMilli().UnixNano()
+ baseTime = time.Unix(0, ns-ns%int64(time.Minute))
interval = 500 * time.Millisecond
casesMeasureData.Write(conn, "service_cpm_minute", "sw_metric",
"service_cpm_minute_data.json", baseTime, interval)
goods = gleak.Goroutines()
@@ -65,7 +66,7 @@ var _ = g.Describe("Query service_cpm_minute", func() {
casesMeasureData.VerifyFn(innerGm,
helpers.SharedContext{
Connection: conn,
BaseTime: baseTime,
- }, helpers.Args{Input: "all", Want: "update", Duration:
1 * time.Hour})
- }, flags.EventuallyTimeout)
+ }, helpers.Args{Input: "all", Want: "update", Duration:
25 * time.Minute, Offset: -20 * time.Minute})
+ }, flags.EventuallyTimeout).Should(gm.Succeed())
})
})
diff --git a/test/integration/other/tls_test.go
b/test/integration/other/tls_test.go
index 9ae5e121..acda8f30 100644
--- a/test/integration/other/tls_test.go
+++ b/test/integration/other/tls_test.go
@@ -56,7 +56,8 @@ var _ = g.Describe("Query service_cpm_minute", func() {
gm.Eventually(helpers.HealthCheck(addr, 10*time.Second,
10*time.Second, grpclib.WithTransportCredentials(creds)),
flags.EventuallyTimeout).Should(gm.Succeed())
conn, err = grpchelper.Conn(addr, 10*time.Second,
grpclib.WithTransportCredentials(creds))
gm.Expect(err).NotTo(gm.HaveOccurred())
- baseTime = timestamp.NowMilli()
+ ns := timestamp.NowMilli().UnixNano()
+ baseTime = time.Unix(0, ns-ns%int64(time.Minute))
interval = 500 * time.Millisecond
casesMeasureData.Write(conn, "service_cpm_minute", "sw_metric",
"service_cpm_minute_data.json", baseTime, interval)
goods = gleak.Goroutines()
@@ -71,7 +72,7 @@ var _ = g.Describe("Query service_cpm_minute", func() {
casesMeasureData.VerifyFn(innerGm,
helpers.SharedContext{
Connection: conn,
BaseTime: baseTime,
- }, helpers.Args{Input: "all", Duration: 1 * time.Hour})
- }, flags.EventuallyTimeout)
+ }, helpers.Args{Input: "all", Duration: 25 *
time.Minute, Offset: -20 * time.Minute})
+ }, flags.EventuallyTimeout).Should(gm.Succeed())
})
})
diff --git a/test/integration/query/query_suite_test.go
b/test/integration/query/query_suite_test.go
index d8521ccf..b514c43b 100644
--- a/test/integration/query/query_suite_test.go
+++ b/test/integration/query/query_suite_test.go
@@ -74,8 +74,6 @@ var _ = SynchronizedBeforeSuite(func() []byte {
casesmeasuredata.Write(conn, "service_traffic", "sw_metric",
"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, "service_cpm_minute", "sw_metric",
"service_cpm_minute_data1.json", now.Add(10*time.Second), interval)
- casesmeasuredata.Write(conn, "service_cpm_minute", "sw_metric",
"service_cpm_minute_data2.json", now.Add(10*time.Minute), interval)
casesmeasuredata.Write(conn, "instance_clr_cpu_minute", "sw_metric",
"instance_clr_cpu_minute_data.json", now, interval)
casesmeasuredata.Write(conn, "service_instance_cpm_minute",
"sw_metric", "service_instance_cpm_minute_data.json", now, interval)
casesmeasuredata.Write(conn, "service_instance_cpm_minute",
"sw_metric", "service_instance_cpm_minute_data1.json", now.Add(10*time.Second),
interval)
diff --git a/test/stress/cases/istio/report.md
b/test/stress/cases/istio/report.md
index 79c4eebd..83d985d6 100644
--- a/test/stress/cases/istio/report.md
+++ b/test/stress/cases/istio/report.md
@@ -3,47 +3,50 @@
## Result
```bash
-Ran 1 of 1 Specs in 2368.640 seconds
+Ran 1 of 1 Specs in 2384.312 seconds
SUCCESS! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
PASS
-Ginkgo ran 1 suite in 39m32.259409687s
+Ginkgo ran 1 suite in 39m47.81357862s
```
## Disk Usage
```bash
-96M ./measure-minute/shard-0/seg-20230613/block-2023061313/inverted
-25M ./measure-minute/shard-0/seg-20230613/block-2023061313/lsm
-18M ./measure-minute/shard-0/seg-20230613/block-2023061313/encoded
-26M ./measure-minute/shard-0/seg-20230613/block-2023061313/tst
-163M ./measure-minute/shard-0/seg-20230613/block-2023061313
-4.0K ./measure-minute/shard-0/seg-20230613/index
-163M ./measure-minute/shard-0/seg-20230613
+4.0K ./measure-minute/shard-0/seg-20230626/index
+24M ./measure-minute/shard-0/seg-20230626/block-2023062607/lsm
+17M ./measure-minute/shard-0/seg-20230626/block-2023062607/encoded
+26M ./measure-minute/shard-0/seg-20230626/block-2023062607/tst
+66M ./measure-minute/shard-0/seg-20230626/block-2023062607
+66M ./measure-minute/shard-0/seg-20230626
4.4M ./measure-minute/shard-0/series/md
-4.4M ./measure-minute/shard-0/series
-167M ./measure-minute/shard-0
-96M ./measure-minute/shard-1/seg-20230613/block-2023061313/inverted
-24M ./measure-minute/shard-1/seg-20230613/block-2023061313/lsm
-20M ./measure-minute/shard-1/seg-20230613/block-2023061313/encoded
-26M ./measure-minute/shard-1/seg-20230613/block-2023061313/tst
-164M ./measure-minute/shard-1/seg-20230613/block-2023061313
-4.0K ./measure-minute/shard-1/seg-20230613/index
-164M ./measure-minute/shard-1/seg-20230613
+2.2M ./measure-minute/shard-0/series/inverted
+20K ./measure-minute/shard-0/series/lsm
+6.6M ./measure-minute/shard-0/series
+72M ./measure-minute/shard-0
+4.0K ./measure-minute/shard-1/seg-20230626/index
+24M ./measure-minute/shard-1/seg-20230626/block-2023062607/lsm
+19M ./measure-minute/shard-1/seg-20230626/block-2023062607/encoded
+26M ./measure-minute/shard-1/seg-20230626/block-2023062607/tst
+68M ./measure-minute/shard-1/seg-20230626/block-2023062607
+68M ./measure-minute/shard-1/seg-20230626
4.4M ./measure-minute/shard-1/series/md
-4.4M ./measure-minute/shard-1/series
-169M ./measure-minute/shard-1
-336M ./measure-minute
-93M ./measure-default/shard-0/seg-20230613/block-2023061313/inverted
-79M ./measure-default/shard-0/seg-20230613/block-2023061313/lsm
-70M ./measure-default/shard-0/seg-20230613/block-2023061313/encoded
-86M ./measure-default/shard-0/seg-20230613/block-2023061313/tst
-326M ./measure-default/shard-0/seg-20230613/block-2023061313
-4.0K ./measure-default/shard-0/seg-20230613/index
-326M ./measure-default/shard-0/seg-20230613
+2.2M ./measure-minute/shard-1/series/inverted
+20K ./measure-minute/shard-1/series/lsm
+6.5M ./measure-minute/shard-1/series
+74M ./measure-minute/shard-1
+146M ./measure-minute
+4.0K ./measure-default/shard-0/seg-20230626/index
+79M ./measure-default/shard-0/seg-20230626/block-2023062607/lsm
+65M ./measure-default/shard-0/seg-20230626/block-2023062607/encoded
+85M ./measure-default/shard-0/seg-20230626/block-2023062607/tst
+228M ./measure-default/shard-0/seg-20230626/block-2023062607
+228M ./measure-default/shard-0/seg-20230626
16M ./measure-default/shard-0/series/md
-16M ./measure-default/shard-0/series
-341M ./measure-default/shard-0
-341M ./measure-default
-676M .
+2.4M ./measure-default/shard-0/series/inverted
+20K ./measure-default/shard-0/series/lsm
+18M ./measure-default/shard-0/series
+245M ./measure-default/shard-0
+245M ./measure-default
+391M .
```