func TestWriteTimeTag(t *testing.T) { tmpDir, _ := ioutil.TempDir("", "shard_test") defer os.RemoveAll(tmpDir) tmpShard := path.Join(tmpDir, "shard") tmpWal := path.Join(tmpDir, "wal") index := tsdb.NewDatabaseIndex("db") opts := tsdb.NewEngineOptions() opts.Config.WALDir = filepath.Join(tmpDir, "wal") sh := tsdb.NewShard(1, index, tmpShard, tmpWal, opts) if err := sh.Open(); err != nil { t.Fatalf("error opening shard: %s", err.Error()) } defer sh.Close() pt := models.MustNewPoint( "cpu", models.NewTags(map[string]string{}), map[string]interface{}{"time": 1.0}, time.Unix(1, 2), ) buf := bytes.NewBuffer(nil) sh.WithLogger(zap.New(zap.NewTextEncoder(), zap.Output(zap.AddSync(buf)))) if err := sh.WritePoints([]models.Point{pt}); err != nil { t.Fatalf("unexpected error: %v", err) } else if got, exp := buf.String(), "dropping field 'time'"; !strings.Contains(got, exp) { t.Fatalf("unexpected log message: %s", strings.TrimSpace(got)) } m := index.Measurement("cpu") if m != nil { t.Fatal("unexpected cpu measurement") } pt = models.MustNewPoint( "cpu", models.NewTags(map[string]string{}), map[string]interface{}{"value": 1.0, "time": 1.0}, time.Unix(1, 2), ) buf = bytes.NewBuffer(nil) sh.WithLogger(zap.New(zap.NewTextEncoder(), zap.Output(zap.AddSync(buf)))) if err := sh.WritePoints([]models.Point{pt}); err != nil { t.Fatalf("unexpected error: %v", err) } else if got, exp := buf.String(), "dropping field 'time'"; !strings.Contains(got, exp) { t.Fatalf("unexpected log message: %s", strings.TrimSpace(got)) } m = index.Measurement("cpu") if m == nil { t.Fatal("expected cpu measurement") } if got, exp := len(m.FieldNames()), 1; got != exp { t.Fatalf("invalid number of field names: got=%v exp=%v", got, exp) } }
// NewTestService returns a new instance of Service. func NewTestService(database string, bind string) *TestService { s, err := NewService(Config{ BindAddress: bind, Database: database, ConsistencyLevel: "one", }) if err != nil { panic(err) } service := &TestService{ Service: s, MetaClient: &internal.MetaClientMock{}, } service.MetaClient.CreateDatabaseFn = func(db string) (*meta.DatabaseInfo, error) { if got, exp := db, database; got != exp { return nil, fmt.Errorf("got %v, expected %v", got, exp) } return nil, nil } if testing.Verbose() { service.Service.WithLogger(zap.New( zap.NewTextEncoder(), zap.Output(os.Stderr), )) } service.Service.MetaClient = service.MetaClient service.Service.PointsWriter = service return service }
// NewTestService returns a new *Service with default mock object members. func NewTestService(t *testing.T) *Service { s := NewService(NewConfig()) ms := NewMetaClient(t) s.MetaClient = ms s.QueryExecutor = influxql.NewQueryExecutor() s.RunInterval = time.Millisecond // Set Logger to write to dev/null so stdout isn't polluted. if testing.Verbose() { s.WithLogger(zap.New( zap.NewTextEncoder(), zap.Output(os.Stderr), )) } // Add a couple test databases and CQs. ms.CreateDatabase("db", "rp") ms.CreateContinuousQuery("db", "cq", `CREATE CONTINUOUS QUERY cq ON db BEGIN SELECT count(cpu) INTO cpu_count FROM cpu WHERE time > now() - 1h GROUP BY time(1s) END`) ms.CreateDatabase("db2", "default") ms.CreateContinuousQuery("db2", "cq2", `CREATE CONTINUOUS QUERY cq2 ON db2 BEGIN SELECT mean(value) INTO cpu_mean FROM cpu WHERE time > now() - 10m GROUP BY time(1m) END`) ms.CreateDatabase("db3", "default") ms.CreateContinuousQuery("db3", "cq3", `CREATE CONTINUOUS QUERY cq3 ON db3 BEGIN SELECT mean(value) INTO "1hAverages".:MEASUREMENT FROM /cpu[0-9]?/ GROUP BY time(10s) END`) return s }
func NewTestService(batchSize int, batchDuration time.Duration) *TestService { c := Config{ BindAddress: "127.0.0.1:0", Database: "collectd_test", BatchSize: batchSize, BatchDuration: toml.Duration(batchDuration), } s := &TestService{ Config: c, Service: NewService(c), MetaClient: &internal.MetaClientMock{}, } s.MetaClient.CreateDatabaseFn = func(name string) (*meta.DatabaseInfo, error) { return nil, nil } s.Service.PointsWriter = s s.Service.MetaClient = s.MetaClient // Set the collectd types using test string. if err := s.Service.SetTypes(typesDBText); err != nil { panic(err) } if testing.Verbose() { s.Service.WithLogger(zap.New( zap.NewTextEncoder(), zap.Output(os.Stderr), )) } return s }
// NewMain return a new instance of Main. func NewMain() *Main { return &Main{ Logger: zap.New( zap.NewTextEncoder(), zap.Output(os.Stderr), ), Stdin: os.Stdin, Stdout: os.Stdout, Stderr: os.Stderr, } }
func NewTestService(c *Config) *TestService { if c == nil { defaultC := NewConfig() c = &defaultC } gservice, err := NewService(*c) if err != nil { panic(err) } service := &TestService{ Service: gservice, MetaClient: &internal.MetaClientMock{}, } service.MetaClient.CreateRetentionPolicyFn = func(string, *meta.RetentionPolicySpec, bool) (*meta.RetentionPolicyInfo, error) { return nil, nil } service.MetaClient.CreateDatabaseWithRetentionPolicyFn = func(string, *meta.RetentionPolicySpec) (*meta.DatabaseInfo, error) { return nil, nil } service.MetaClient.DatabaseFn = func(string) *meta.DatabaseInfo { return nil } service.MetaClient.RetentionPolicyFn = func(string, string) (*meta.RetentionPolicyInfo, error) { return nil, nil } if testing.Verbose() { service.Service.WithLogger(zap.New( zap.NewTextEncoder(), zap.Output(os.Stderr), )) } // Set the Meta Client and PointsWriter. service.Service.MetaClient = service.MetaClient service.Service.PointsWriter = service return service }
// NewQueryExecutor returns a new instance of QueryExecutor. // This query executor always has a node id of 0. func NewQueryExecutor() *QueryExecutor { e := &QueryExecutor{ QueryExecutor: influxql.NewQueryExecutor(), } e.StatementExecutor = &coordinator.StatementExecutor{ MetaClient: &e.MetaClient, TSDBStore: &e.TSDBStore, } e.QueryExecutor.StatementExecutor = e.StatementExecutor var out io.Writer = &e.LogOutput if testing.Verbose() { out = io.MultiWriter(out, os.Stderr) } e.QueryExecutor.WithLogger(zap.New( zap.NewTextEncoder(), zap.Output(os.Stderr), )) return e }
func TestWriteTimeField(t *testing.T) { tmpDir, _ := ioutil.TempDir("", "shard_test") defer os.RemoveAll(tmpDir) tmpShard := path.Join(tmpDir, "shard") tmpWal := path.Join(tmpDir, "wal") index := tsdb.NewDatabaseIndex("db") opts := tsdb.NewEngineOptions() opts.Config.WALDir = filepath.Join(tmpDir, "wal") sh := tsdb.NewShard(1, index, tmpShard, tmpWal, opts) if err := sh.Open(); err != nil { t.Fatalf("error opening shard: %s", err.Error()) } defer sh.Close() pt := models.MustNewPoint( "cpu", models.NewTags(map[string]string{"time": "now"}), map[string]interface{}{"value": 1.0}, time.Unix(1, 2), ) buf := bytes.NewBuffer(nil) sh.WithLogger(zap.New(zap.NewTextEncoder(), zap.Output(zap.AddSync(buf)))) if err := sh.WritePoints([]models.Point{pt}); err != nil { t.Fatalf("unexpected error: %v", err) } else if got, exp := buf.String(), "dropping tag 'time'"; !strings.Contains(got, exp) { t.Fatalf("unexpected log message: %s", strings.TrimSpace(got)) } key := models.MakeKey([]byte("cpu"), nil) series := index.Series(string(key)) if series == nil { t.Fatal("expected series") } else if len(series.Tags) != 0 { t.Fatalf("unexpected number of tags: got=%v exp=%v", len(series.Tags), 0) } }
func NewTestService(c *Config) *TestService { if c == nil { defaultC := NewConfig() c = &defaultC } service := &TestService{ Service: NewService(*c), Config: *c, MetaClient: &internal.MetaClientMock{}, } if testing.Verbose() { service.Service.WithLogger(zap.New( zap.NewTextEncoder(), zap.Output(os.Stderr), )) } service.Service.MetaClient = service.MetaClient service.Service.PointsWriter = service return service }
// SetLogOutput sets the logger used for all messages. It must not be called // after the Open method has been called. func (s *Server) SetLogOutput(w io.Writer) { s.Logger = zap.New(zap.NewTextEncoder(), zap.Output(zap.AddSync(w))) }
// NewServer returns a new instance of Server built from a config. func NewServer(c *Config, buildInfo *BuildInfo) (*Server, error) { // We need to ensure that a meta directory always exists even if // we don't start the meta store. node.json is always stored under // the meta directory. if err := os.MkdirAll(c.Meta.Dir, 0777); err != nil { return nil, fmt.Errorf("mkdir all: %s", err) } // 0.10-rc1 and prior would sometimes put the node.json at the root // dir which breaks backup/restore and restarting nodes. This moves // the file from the root so it's always under the meta dir. oldPath := filepath.Join(filepath.Dir(c.Meta.Dir), "node.json") newPath := filepath.Join(c.Meta.Dir, "node.json") if _, err := os.Stat(oldPath); err == nil { if err := os.Rename(oldPath, newPath); err != nil { return nil, err } } _, err := influxdb.LoadNode(c.Meta.Dir) if err != nil { if !os.IsNotExist(err) { return nil, err } } if err := raftDBExists(c.Meta.Dir); err != nil { return nil, err } // In 0.10.0 bind-address got moved to the top level. Check // The old location to keep things backwards compatible bind := c.BindAddress s := &Server{ buildInfo: *buildInfo, err: make(chan error), closing: make(chan struct{}), BindAddress: bind, Logger: zap.New( zap.NewTextEncoder(), zap.Output(os.Stderr), ), MetaClient: meta.NewClient(c.Meta), reportingDisabled: c.ReportingDisabled, httpAPIAddr: c.HTTPD.BindAddress, httpUseTLS: c.HTTPD.HTTPSEnabled, tcpAddr: bind, config: c, } s.Monitor = monitor.New(s, c.Monitor) if err := s.MetaClient.Open(); err != nil { return nil, err } s.TSDBStore = tsdb.NewStore(c.Data.Dir) s.TSDBStore.EngineOptions.Config = c.Data // Copy TSDB configuration. s.TSDBStore.EngineOptions.EngineVersion = c.Data.Engine // Create the Subscriber service s.Subscriber = subscriber.NewService(c.Subscriber) // Initialize points writer. s.PointsWriter = coordinator.NewPointsWriter() s.PointsWriter.WriteTimeout = time.Duration(c.Coordinator.WriteTimeout) s.PointsWriter.TSDBStore = s.TSDBStore s.PointsWriter.Subscriber = s.Subscriber // Initialize query executor. s.QueryExecutor = influxql.NewQueryExecutor() s.QueryExecutor.StatementExecutor = &coordinator.StatementExecutor{ MetaClient: s.MetaClient, TaskManager: s.QueryExecutor.TaskManager, TSDBStore: coordinator.LocalTSDBStore{Store: s.TSDBStore}, Monitor: s.Monitor, PointsWriter: s.PointsWriter, MaxSelectPointN: c.Coordinator.MaxSelectPointN, MaxSelectSeriesN: c.Coordinator.MaxSelectSeriesN, MaxSelectBucketsN: c.Coordinator.MaxSelectBucketsN, } s.QueryExecutor.TaskManager.QueryTimeout = time.Duration(c.Coordinator.QueryTimeout) s.QueryExecutor.TaskManager.LogQueriesAfter = time.Duration(c.Coordinator.LogQueriesAfter) s.QueryExecutor.TaskManager.MaxConcurrentQueries = c.Coordinator.MaxConcurrentQueries // Initialize the monitor s.Monitor.Version = s.buildInfo.Version s.Monitor.Commit = s.buildInfo.Commit s.Monitor.Branch = s.buildInfo.Branch s.Monitor.BuildTime = s.buildInfo.Time s.Monitor.PointsWriter = (*monitorPointsWriter)(s.PointsWriter) return s, nil }