From da117999e6ce4374d3ebc0e9c1fc863115b967ef Mon Sep 17 00:00:00 2001 From: xufangyou Date: Wed, 13 Jul 2022 18:24:18 +0800 Subject: [PATCH] data accessor --- config/common.go | 116 ++++++++++++++++++ config/define.go | 62 +++++++--- .../Accessor/README.md" | 2 +- .../\346\236\266\346\236\204\345\233\276.png" | Bin 0 -> 56541 bytes errors/type.go | 1 + operations/manager_service.go | 7 ++ 6 files changed, 167 insertions(+), 21 deletions(-) create mode 100644 "docs/zh/\347\263\273\347\273\237\346\236\266\346\236\204/Accessor/\346\236\266\346\236\204\345\233\276.png" diff --git a/config/common.go b/config/common.go index a628630..fa86ab2 100644 --- a/config/common.go +++ b/config/common.go @@ -1,5 +1,25 @@ package config +import ( + "fmt" + "time" +) + +type ( + MetaStoreType = string + DataStoreType = string +) + +const ( + MetaStoreTypeFile MetaStoreType = "file" + + DataStoreTypeInfluxDB DataStoreType = "influxdb" + DataStoreTypeTDengine DataStoreType = "tdengine" + + MinBatchSize = 1 + MaxBatchSize = 10000 +) + type DriverOptions struct { DriverHealthCheckIntervalSecond int `json:"driver_health_check_interval_second" yaml:"driver_health_check_interval_second"` DeviceHealthCheckIntervalSecond int `json:"device_health_check_interval_second" yaml:"device_health_check_interval_second"` @@ -13,6 +33,102 @@ type ManagerOptions struct { HTTP struct { Port int `json:"port" yaml:"port"` } `json:"http" yaml:"http"` + + MetaStoreOptions *MetaStoreOptions `json:"meta_store" yaml:"meta_store"` + DataStoreOptions *DataStoreOptions `json:"data_store" yaml:"data_store"` +} + +func (o *ManagerOptions) Check() error { + if o.DataStoreOptions == nil { + return nil + } + if err := o.DataStoreOptions.Check(); err != nil { + return err + } + return nil +} + +type MetaStoreOptions struct { + Type MetaStoreType `json:"type" yaml:"type"` + File *FileOptions `json:"file" yaml:"file"` +} + +type FileOptions struct { + Path string `json:"path" yaml:"path"` +} + +type DataStoreOptions struct { + Type DataStoreType `json:"type" yaml:"type"` + + // Common for All DBs + // https://docs.taosdata.com/taos-sql/database#创建数据库 + Database string `json:"database" yaml:"database"` + BatchSize int `json:"batch_size" yaml:"batch_size"` + + InfluxDB *InfluxDBOptions `json:"influxdb" yaml:"influxdb"` + TDengine *TDengineOptions `json:"tdengine" yaml:"tdengine"` +} + +func (o *DataStoreOptions) Check() error { + if o.Database == "" { + return fmt.Errorf("influxdb database must be specified") + } + + if o.BatchSize > MaxBatchSize { + return fmt.Errorf("max-batch-size cannot be large than %d", MaxBatchSize) + } + if o.BatchSize < MinBatchSize { + return fmt.Errorf("batch-size cannot be less than %d", MinBatchSize) + } + + switch o.Type { + case DataStoreTypeInfluxDB: + if o.InfluxDB == nil { + return fmt.Errorf("the configuration for InfluxDB must be required") + } + return o.InfluxDB.Check() + case DataStoreTypeTDengine: + if o.TDengine == nil { + return fmt.Errorf("the configuration for TDengine must be required") + } + return o.TDengine.Check() + default: + return fmt.Errorf("unsupported datastore type: %s", o.Type) + } +} + +type InfluxDBOptions struct { + URL string `json:"url" yaml:"url"` + Username string `json:"username" yaml:"username"` + Password string `json:"password" yaml:"password"` + UserAgent string `json:"user_agent" yaml:"user_agent"` + Precision string `json:"precision" yaml:"precision"` + RetentionPolicy string `json:"retention_policy" yaml:"retention_policy"` + WriteConsistency string `json:"write_consistency" yaml:"write_consistency"` + Timeout time.Duration `json:"timeout" yaml:"timeout"` +} + +func (o *InfluxDBOptions) Check() error { + return nil +} + +type TDengineOptions struct { + Schema string `json:"schema" yaml:"schema"` + Host string `json:"host" yaml:"host"` + Port uint16 `json:"port" yaml:"port"` + Username string `json:"username" yaml:"username"` + Password string `json:"password" yaml:"password"` + Keep uint `json:"keep" yaml:"keep"` + Days uint `json:"days" yaml:"days"` + Blocks uint `json:"blocks" yaml:"blocks"` + Update uint8 `json:"update" yaml:"update"` + Precision string `json:"precision" yaml:"precision"` + + MaxBatchSize int `json:"max_batch_size" yaml:"max_batch_size"` +} + +func (o *TDengineOptions) Check() error { + return nil } type LogOptions struct { diff --git a/config/define.go b/config/define.go index 4f76a8a..99fe80e 100644 --- a/config/define.go +++ b/config/define.go @@ -5,6 +5,7 @@ import ( "github.com/mitchellh/mapstructure" "github.com/spf13/viper" "github.com/thingio/edge-device-std/errors" + "sync" ) const ( @@ -14,6 +15,9 @@ const ( FileFormat = "yaml" ) +var cfg = new(Configuration) +var once = sync.Once{} + type Configuration struct { DriverOptions DriverOptions `json:"driver" yaml:"driver"` ManagerOptions ManagerOptions `json:"manager" yaml:"manager"` @@ -21,29 +25,47 @@ type Configuration struct { MessageBus MessageBusOptions `json:"msgbus" yaml:"msgbus"` } -func NewConfiguration() (*Configuration, errors.EdgeError) { - // read the configuration file path - var configPath string - flag.StringVar(&configPath, "cp", FilePath, "config file path, e.g. \"/etc\"") - var configName string - flag.StringVar(&configName, "cn", FileName, "config file name, e.g. \"config\", excluding the suffix") - flag.Parse() - - viper.SetEnvPrefix(EnvPrefix) - viper.AutomaticEnv() - viper.AddConfigPath(configPath) - viper.SetConfigName(configName) - viper.SetConfigType(FileFormat) - if err := viper.ReadInConfig(); err != nil { - return nil, errors.Configuration.Cause(err, "fail to read the configuration file") +func (c *Configuration) Check() error { + if err := c.ManagerOptions.Check(); err != nil { + return err } + return nil +} + +func NewConfiguration() (*Configuration, errors.EdgeError) { + var err error + + once.Do(func() { + // read the configuration file path + var configPath string + flag.StringVar(&configPath, "cp", FilePath, "config file path, e.g. \"/etc\"") + var configName string + flag.StringVar(&configName, "cn", FileName, "config file name, e.g. \"config\", excluding the suffix") + flag.Parse() - cfg := new(Configuration) - if err := viper.Unmarshal(cfg, func(dc *mapstructure.DecoderConfig) { - dc.TagName = FileFormat - }); err != nil { + viper.SetEnvPrefix(EnvPrefix) + viper.AutomaticEnv() + viper.AddConfigPath(configPath) + viper.SetConfigName(configName) + viper.SetConfigType(FileFormat) + + if err = viper.ReadInConfig(); err != nil { + return + } + + if err = viper.Unmarshal(cfg, func(dc *mapstructure.DecoderConfig) { + dc.TagName = FileFormat + }); err != nil { + return + } + + if err = cfg.Check(); err != nil { + return + } + }) + + if err != nil { return nil, errors.Configuration.Cause(err, "fail to unmarshal the configuration file") } - return cfg, nil } diff --git "a/docs/zh/\347\263\273\347\273\237\346\236\266\346\236\204/Accessor/README.md" "b/docs/zh/\347\263\273\347\273\237\346\236\266\346\236\204/Accessor/README.md" index 5371e07..349c0e5 100644 --- "a/docs/zh/\347\263\273\347\273\237\346\236\266\346\236\204/Accessor/README.md" +++ "b/docs/zh/\347\263\273\347\273\237\346\236\266\346\236\204/Accessor/README.md" @@ -4,7 +4,7 @@ 1. 设备数据持久化与查询; 1. 流程: 1. 设备元数据增加 `recording` 字段,表示是否将采集的设备进行落库; - 2. accessor 启动后,连接到 manager,先从 manager 获取全量设备元数据,再监听设备元数据的变更(使用 edge-device-std 定义的 operations ); + 2. accessor 启动后,先从 manager 获取全量设备元数据,再监听设备元数据的变更(使用 edge-device-std 定义的 operations ); 3. 如果设备的 `recording` 字段为 true,则在 accessor 中启动一个 Recorder 监听 event 以及 props 对应的主题,将采集到的数据落库,否则跳过或者关闭 Recorder; 2. 是否需要支持多数据源,如 InfluxDB | TDEngine 等? diff --git "a/docs/zh/\347\263\273\347\273\237\346\236\266\346\236\204/Accessor/\346\236\266\346\236\204\345\233\276.png" "b/docs/zh/\347\263\273\347\273\237\346\236\266\346\236\204/Accessor/\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..a235cceb8bb38a41eaf4dcba0d2b8fcdb4818020 GIT binary patch literal 56541 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 literal 0 HcmV?d00001 diff --git a/errors/type.go b/errors/type.go index 53edd26..b89efd8 100644 --- a/errors/type.go +++ b/errors/type.go @@ -18,6 +18,7 @@ var ( Driver = NewType(300000, "Driver") DeviceTwin = NewType(400000, "DeviceTwin") MetaStore = NewType(500000, "MetaStore") + DataStore = NewType(600000, "DataStore") ) type ErrType struct { diff --git a/operations/manager_service.go b/operations/manager_service.go index e9a5386..18673db 100644 --- a/operations/manager_service.go +++ b/operations/manager_service.go @@ -71,6 +71,7 @@ func (m *metaManagerService) subscribe(optType MetaOperationType, type ( DataManagerService interface { + Subscribe(topic string) (<-chan interface{}, func(), error) SubscribeDeviceStatus(protocolID string) (<-chan interface{}, func(), error) SubscribeDeviceProps(protocolID, productID, deviceID string, propertyID models.ProductPropertyID) (<-chan interface{}, func(), error) SubscribeDeviceEvent(protocolID, productID, deviceID string, eventID models.ProductEventID) (<-chan interface{}, func(), error) @@ -85,6 +86,12 @@ func newDataManagerService(mb bus.MessageBus, lg *logger.Logger) (DataManagerSer return &dataManagerService{mb: mb, lg: lg}, nil } +func (d *dataManagerService) Subscribe(topic string) (<-chan interface{}, func(), error) { + return subscribe(d.mb, d.lg, topic, func(msg *message.Message) (interface{}, error) { + return msg, nil + }) +} + func (d *dataManagerService) SubscribeDeviceStatus(protocolID string) (<-chan interface{}, func(), error) { return d.subscribe(protocolID, TopicSingleLevelWildcard, TopicSingleLevelWildcard, TopicSingleLevelWildcard, DataOperationTypeHealthCheck, func(o *DataOperation) (interface{}, error) {