diff --git a/tsdb/shard.go b/tsdb/shard.go index 0193ef7bef..067b206e37 100644 --- a/tsdb/shard.go +++ b/tsdb/shard.go @@ -1939,6 +1939,20 @@ func (fs *MeasurementFieldSet) Bytes() int { return b } +// MeasurementNames returns the names of all of the measurements in the field set in +// lexographical order. +func (fs *MeasurementFieldSet) MeasurementNames() []string { + fs.mu.RLock() + defer fs.mu.RUnlock() + + names := make([]string, 0, len(fs.fields)) + for name := range fs.fields { + names = append(names, name) + } + sort.Strings(names) + return names +} + // Fields returns fields for a measurement by name. func (fs *MeasurementFieldSet) Fields(name []byte) *MeasurementFields { fs.mu.RLock() diff --git a/tsdb/shard_test.go b/tsdb/shard_test.go index 64038ee192..eb682c384f 100644 --- a/tsdb/shard_test.go +++ b/tsdb/shard_test.go @@ -28,6 +28,7 @@ import ( _ "github.com/influxdata/influxdb/v2/tsdb/engine" _ "github.com/influxdata/influxdb/v2/tsdb/index" "github.com/influxdata/influxql" + "github.com/stretchr/testify/assert" ) func TestShardWriteAndIndex(t *testing.T) { @@ -1705,6 +1706,24 @@ func TestMeasurementFieldSet_ConcurrentSave(t *testing.T) { } } +func TestMeasurementFieldSet_MeasurementNames(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "fields.idx") + mf, err := tsdb.NewMeasurementFieldSet(path) + if err != nil { + t.Fatalf("NewMeasurementFieldSet error: %v", err) + } + defer mf.Close() + + mf.CreateFieldsIfNotExists([]byte("cpu")) + mf.CreateFieldsIfNotExists([]byte("memory")) + mf.CreateFieldsIfNotExists([]byte("disk_usage")) + + exp := []string{"cpu", "disk_usage", "memory"} + got := mf.MeasurementNames() + assert.Equal(t, exp, got) +} + func testFieldMaker(t *testing.T, wg *sync.WaitGroup, mf *tsdb.MeasurementFieldSet, measurement string, fieldNames []string) { defer wg.Done() fields := mf.CreateFieldsIfNotExists([]byte(measurement))