euspaceCfg.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package config
  2. import (
  3. "fmt"
  4. "github.com/coroot/coroot-node-agent/flags"
  5. "github.com/coroot/coroot-node-agent/utils"
  6. "github.com/coroot/coroot-node-agent/utils/enums"
  7. "github.com/fsnotify/fsnotify"
  8. log "github.com/sirupsen/logrus"
  9. "github.com/spf13/viper"
  10. "reflect"
  11. )
  12. type euspaceCfgRecord struct {
  13. LogLevel string `mapstructure:"logLevel"`
  14. NetDataInterval int `mapstructure:"netDataInterval"`
  15. ConfigServer string `mapstructure:"configServer"`
  16. DataServer string `mapstructure:"dataServer"`
  17. }
  18. type euspaceCfg struct {
  19. runtimeV *viper.Viper
  20. watchedV *viper.Viper
  21. cfgRecordLast *euspaceCfgRecord
  22. }
  23. func initEuspaceCfg() (*euspaceCfg, error) {
  24. v := viper.New()
  25. v.SetConfigName("config")
  26. v.SetConfigType("yaml")
  27. v.AddConfigPath(utils.GetDefaultConfPath())
  28. if err := v.ReadInConfig(); err != nil {
  29. /*if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
  30. return nil, err
  31. }*/
  32. return nil, err
  33. }
  34. sv := viper.New()
  35. sv.SetConfigFile(v.ConfigFileUsed())
  36. ec := &euspaceCfg{
  37. runtimeV: v,
  38. watchedV: sv,
  39. cfgRecordLast: new(euspaceCfgRecord),
  40. }
  41. ec.setDefault()
  42. return ec, nil
  43. }
  44. func (ec *euspaceCfg) setDefault() {
  45. ec.runtimeV.SetDefault("logLevel", enums.DefaultLogLevel)
  46. ec.runtimeV.SetDefault("netDataInterval", enums.DefaultNetDataInterval1Min)
  47. ec.runtimeV.SetDefault("configServer", "")
  48. ec.runtimeV.SetDefault("dataServer", "")
  49. }
  50. func (ec *euspaceCfg) syncConfToFile(ecr *euspaceCfgRecord) error {
  51. if ecr != nil {
  52. syncV := viper.New()
  53. syncV.SetConfigFile(ec.watchedV.ConfigFileUsed())
  54. syncV.Set("logLevel", ecr.LogLevel)
  55. syncV.Set("netDataInterval", ecr.NetDataInterval)
  56. syncV.Set("configServer", ecr.ConfigServer)
  57. syncV.Set("dataServer", ecr.DataServer)
  58. err := syncV.WriteConfig()
  59. if err != nil {
  60. return fmt.Errorf("sync Config to [%s] failed : %s", ec.watchedV.ConfigFileUsed(), err.Error())
  61. }
  62. return nil
  63. }
  64. return fmt.Errorf("sync Config to [%s] euspaceCfgRecord is nil", ec.watchedV.ConfigFileUsed())
  65. }
  66. func (ec *euspaceCfg) watchConfig(c *Config) {
  67. ec.watchedV.OnConfigChange(func(e fsnotify.Event) {
  68. //fmt.Printf("euspaceCfg Config file changed [%s],Op:%d ,AllKeys:%#v======> \n", e.Name, e.Op, ec.watchedV.AllSettings())
  69. if !e.Op.Has(fsnotify.Create) && !e.Op.Has(fsnotify.Write) {
  70. return
  71. }
  72. c.m.Lock()
  73. //defer c.m.Unlock()
  74. cr := new(euspaceCfgRecord)
  75. if err := ec.watchedV.Unmarshal(cr); err != nil {
  76. log.Warningf("on-Config-change, `watchedV` unmarshal `euspaceCfgRecord` failed : %s", err.Error())
  77. c.m.Unlock()
  78. return
  79. }
  80. if reflect.DeepEqual(ec.cfgRecordLast, cr) {
  81. c.m.Unlock()
  82. return
  83. }
  84. //拷贝ec.cfgRecordLast 到临时变量,目的是及时释放锁
  85. crLast := ec.cfgRecordLast
  86. //update cfgRecordLast
  87. ec.cfgRecordLast = cr
  88. c.m.Unlock()
  89. if *flags.ConfigServer == "" {
  90. if crLast.ConfigServer != cr.ConfigServer {
  91. c.m.Lock()
  92. ec.runtimeV.Set("configServer", cr.ConfigServer)
  93. c.m.Unlock()
  94. c.noticeSubscribers(ScbTypeConfigServerChg)
  95. }
  96. }
  97. if *flags.DataServer == "" {
  98. if crLast.DataServer != cr.DataServer {
  99. c.m.Lock()
  100. ec.runtimeV.Set("dataServer", cr.DataServer)
  101. c.m.Unlock()
  102. c.noticeSubscribers(ScbTypeDataServerChg)
  103. c.noticeSubscribers(ScbTypeTracesEndpointChg)
  104. }
  105. }
  106. if *flags.LogLevel == "" {
  107. if crLast.LogLevel != cr.LogLevel {
  108. c.m.Lock()
  109. ec.runtimeV.Set("logLevel", cr.LogLevel)
  110. c.m.Unlock()
  111. c.noticeSubscribers(ScbTypeLogLevelChg)
  112. }
  113. }
  114. if crLast.NetDataInterval != cr.NetDataInterval {
  115. c.m.Lock()
  116. ec.runtimeV.Set("netDataInterval", cr.NetDataInterval)
  117. c.m.Unlock()
  118. c.noticeSubscribers(ScbTypeNetDataIntervalChg)
  119. }
  120. })
  121. ec.watchedV.WatchConfig()
  122. }