omniagentCfg.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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/fsnotify/fsnotify"
  7. log "github.com/sirupsen/logrus"
  8. "github.com/spf13/viper"
  9. "path/filepath"
  10. "reflect"
  11. )
  12. type commonCfgRecord struct {
  13. ConfigServer string `mapstructure:"config_server"`
  14. DataServer string `mapstructure:"data_server"`
  15. //FileServer string `ini:"file_server"`
  16. ProxyConfigServer string `mapstructure:"proxy_config_server"`
  17. ProxyDataServer string `mapstructure:"proxy_data_server"`
  18. //ProxyFileServer string `ini:"proxy_file_server"`
  19. //Ip string `ini:"ip"`
  20. //Token string `ini:"token"`
  21. //HostId string `ini:"host_id"`
  22. //HostTag string `ini:"host_tag"`
  23. //RealAccountId string `ini:"real_account_id"`
  24. }
  25. type omniCommonCfg struct {
  26. omniCommonV *viper.Viper
  27. commonSecV *viper.Viper
  28. cfgRecordLast *commonCfgRecord
  29. }
  30. func initOmniCommonCfg() (*omniCommonCfg, error) {
  31. var (
  32. omniConfDirAbs string
  33. omniConfDirAbs2 string
  34. err error
  35. )
  36. v := viper.New()
  37. if *flags.CommonIni != "" {
  38. // *flags.CommonIni默认值 => /opt/cloudwise/omniagent/conf/common.ini
  39. omniConfDirAbs, err = filepath.Abs(filepath.Dir(*flags.CommonIni))
  40. if err != nil {
  41. omniConfDirAbs = ""
  42. log.Warningf("get filepath.Abs for the flags.CommonIni[%s] occurs error: %s.", *flags.CommonIni, err.Error())
  43. } else {
  44. v.AddConfigPath(omniConfDirAbs)
  45. }
  46. }
  47. //结合部署路径,获取omniagent common.ini文件所在路径 => eg: /xxx/cloudwise/omniagent/agents/euspace/0.0.7/../../../conf
  48. omniConfDir := filepath.Join(filepath.Dir(filepath.Dir(filepath.Dir(utils.GetRootPath()))), "conf")
  49. omniConfDirAbs2, err = filepath.Abs(omniConfDir)
  50. if err != nil {
  51. omniConfDirAbs2 = ""
  52. log.Warningf("get filepath.Abs for omniConfDir[%s] occurs error: %s.", omniConfDir, err.Error())
  53. } else {
  54. if omniConfDirAbs2 != "" && omniConfDirAbs != omniConfDirAbs2 {
  55. v.AddConfigPath(omniConfDirAbs2)
  56. }
  57. }
  58. v.SetConfigName("common")
  59. v.SetConfigType("ini")
  60. if err = v.ReadInConfig(); err != nil {
  61. if _, ok := err.(viper.ConfigFileNotFoundError); ok {
  62. return nil, nil
  63. }
  64. return nil, err
  65. }
  66. commonSecV := v.Sub("common")
  67. if commonSecV == nil {
  68. return nil, fmt.Errorf("`common` section not found in Config file [%s]", v.ConfigFileUsed())
  69. }
  70. //fmt.Printf("v.ConfigFileUsed() =====> %s \n", v.ConfigFileUsed())
  71. //set RunInOmniagent at first
  72. *flags.RunInOmniagent = true
  73. //set CommonIni
  74. if v.ConfigFileUsed() != *flags.CommonIni {
  75. *flags.CommonIni = v.ConfigFileUsed()
  76. }
  77. // set ServerPrefix
  78. if *flags.ServerPrefix == "" {
  79. *flags.ServerPrefix = "/apm"
  80. }
  81. omc := &omniCommonCfg{
  82. omniCommonV: v,
  83. commonSecV: commonSecV,
  84. cfgRecordLast: new(commonCfgRecord),
  85. }
  86. return omc, nil
  87. }
  88. func (omc *omniCommonCfg) getConfigServer() string {
  89. omniPrxCfgSvr := omc.commonSecV.GetString("proxy_config_server")
  90. if omniPrxCfgSvr != "" {
  91. return omniPrxCfgSvr
  92. } else {
  93. return omc.commonSecV.GetString("config_server")
  94. }
  95. }
  96. func (omc *omniCommonCfg) getDataServer() string {
  97. omniPrxDataSvr := omc.commonSecV.GetString("proxy_data_server")
  98. if omniPrxDataSvr != "" {
  99. return omniPrxDataSvr
  100. } else {
  101. return omc.commonSecV.GetString("data_server")
  102. }
  103. }
  104. func (omc *omniCommonCfg) getFileServer() string {
  105. omniPrxFileSvr := omc.commonSecV.GetString("proxy_file_server")
  106. if omniPrxFileSvr != "" {
  107. return omniPrxFileSvr
  108. } else {
  109. return omc.commonSecV.GetString("file_server")
  110. }
  111. }
  112. func (omc *omniCommonCfg) watchConfig(c *Config) {
  113. omc.omniCommonV.OnConfigChange(func(e fsnotify.Event) {
  114. //fmt.Printf("Config file changed [%s],Op:%d ,AllKeys:%#v======> \n", e.Name, e.Op, omc.omniCommonV.AllSettings())
  115. if !e.Op.Has(fsnotify.Create) && !e.Op.Has(fsnotify.Write) {
  116. return
  117. }
  118. c.m.Lock()
  119. //defer c.m.Unlock()
  120. omc.commonSecV = omc.omniCommonV.Sub("common")
  121. if omc.commonSecV == nil {
  122. //`common` section not found
  123. c.m.Unlock()
  124. return
  125. }
  126. ccr := new(commonCfgRecord)
  127. if err := omc.commonSecV.Unmarshal(ccr); err != nil {
  128. log.Warningf("on-Config-change,`omniCommonV` unmarshal `commonCfgRecord` failed : %s", err.Error())
  129. c.m.Unlock()
  130. return
  131. }
  132. if reflect.DeepEqual(omc.cfgRecordLast, ccr) {
  133. c.m.Unlock()
  134. return
  135. }
  136. //update cfgRecordLast
  137. omc.cfgRecordLast = ccr
  138. c.m.Unlock()
  139. hasChange := false
  140. omniCfgSvr := omc.getConfigServer()
  141. if omniCfgSvr != "" && omniCfgSvr != c.euspaceCfg.cfgRecordLast.ConfigServer {
  142. hasChange = true
  143. c.euspaceCfg.cfgRecordLast.ConfigServer = omniCfgSvr
  144. if *flags.ConfigServer == "" {
  145. c.m.Lock()
  146. c.euspaceCfg.runtimeV.Set("configServer", omniCfgSvr)
  147. c.m.Unlock()
  148. c.noticeSubscribers(ScbTypeConfigServerChg)
  149. }
  150. }
  151. omniDataSvr := omc.getDataServer()
  152. if omniDataSvr != "" && omniDataSvr != c.euspaceCfg.cfgRecordLast.DataServer {
  153. hasChange = true
  154. c.euspaceCfg.cfgRecordLast.DataServer = omniDataSvr
  155. if *flags.DataServer == "" {
  156. c.m.Lock()
  157. c.euspaceCfg.runtimeV.Set("dataServer", omniDataSvr)
  158. c.m.Unlock()
  159. c.noticeSubscribers(ScbTypeDataServerChg)
  160. c.noticeSubscribers(ScbTypeTracesEndpointChg)
  161. }
  162. }
  163. // sync common.ini to euspace Config.ymal
  164. if hasChange {
  165. c.m.Lock()
  166. if err := c.euspaceCfg.syncConfToFile(c.euspaceCfg.cfgRecordLast); err != nil {
  167. log.Warningf("on-Config-change,%s", err.Error())
  168. }
  169. c.m.Unlock()
  170. }
  171. })
  172. omc.omniCommonV.WatchConfig()
  173. }