apply.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package config
  2. import (
  3. "os"
  4. "github.com/coroot/coroot-node-agent/flags"
  5. klog "github.com/sirupsen/logrus"
  6. "github.com/spf13/viper"
  7. )
  8. // shouldUpdateConfig 判断是否应该更新配置
  9. // 热更新时,如果配置项通过命令行参数或环境变量设置,则不更新
  10. func shouldUpdateConfig(configKey, envKey1, envKey2 string, currentValue, configValue, defaultValue string, isHotReload bool) bool {
  11. // 检查环境变量(无论是初始加载还是热更新)
  12. if os.Getenv(envKey1) != "" || os.Getenv(envKey2) != "" {
  13. if isHotReload {
  14. klog.Debugf("[config] Skipping %s update (set via environment variable)", configKey)
  15. }
  16. return false
  17. }
  18. // 检查当前值是否与默认值不同
  19. // 如果不同,说明是通过命令行参数设置的(因为 kingpin.Parse() 已经处理了命令行参数)
  20. // 无论是初始加载还是热更新,都不应该被配置文件覆盖
  21. if currentValue != defaultValue {
  22. if isHotReload {
  23. klog.Debugf("[config] Skipping %s update (set via command line: %s)", configKey, currentValue)
  24. } else {
  25. klog.Debugf("[config] Skipping %s update from config file (set via command line: %s)", configKey, currentValue)
  26. }
  27. return false
  28. }
  29. // 当前值等于默认值,说明没有通过命令行参数设置,可以更新
  30. return true
  31. }
  32. // applyConfig 应用配置到 flags
  33. // isHotReload: true 表示热更新,false 表示初始加载
  34. // 热更新时不会覆盖通过命令行参数或环境变量设置的配置项
  35. // 注意:ConfigServer 和 DataServer 的最高优先级是 common.ini(如果 RunInOmniagent 为 true),不受此函数影响
  36. func applyConfig(v *viper.Viper, isHotReload bool) {
  37. klog.Infof("═══════════════════════════════════════════════════════════════")
  38. if isHotReload {
  39. klog.Infof("🔄 [CONFIG] Starting hot reload configuration...")
  40. } else {
  41. klog.Infof("📋 [CONFIG] Starting initial configuration load...")
  42. }
  43. klog.Infof("═══════════════════════════════════════════════════════════════")
  44. // Server 配置
  45. // ConfigServer 和 DataServer 从 common.ini 加载(如果 RunInOmniagent 为 true)
  46. // 但是,无论是否在 RunInOmniagent 模式下,只要配置文件中的 config_server 发生改变,就更新 ProxyClient
  47. if v.IsSet("server.config_server") {
  48. newConfigServer := v.GetString("server.config_server")
  49. oldConfigServer := *flags.ConfigServer
  50. klog.Infof("📝 [CONFIG] server.config_server: config_file=%s, current=%s, flags_empty=%v",
  51. newConfigServer, oldConfigServer, *flags.ConfigServer == "")
  52. // 参考备份代码:只有当 *flags.ConfigServer == "" 时才从配置文件更新
  53. if *flags.ConfigServer == "" && !*flags.RunInOmniagent {
  54. if newConfigServer != oldConfigServer {
  55. *flags.ConfigServer = newConfigServer
  56. klog.Infof("✅ [CONFIG] server.config_server UPDATED: %s -> %s", oldConfigServer, newConfigServer)
  57. // 更新 ProxyClient 的 endpoints
  58. updateProxyClientEndpoints(newConfigServer)
  59. } else {
  60. klog.Infof("⏭️ [CONFIG] server.config_server UNCHANGED: %s", newConfigServer)
  61. }
  62. } else if *flags.RunInOmniagent {
  63. // 在 RunInOmniagent 模式下,即使不更新 flags.ConfigServer(因为 common.ini 优先级更高),
  64. // 只要配置文件中的值改变了,也更新 ProxyClient
  65. if newConfigServer != oldConfigServer {
  66. klog.Infof("🔄 [CONFIG] server.config_server (RunInOmniagent mode): updating ProxyClient only: %s -> %s", oldConfigServer, newConfigServer)
  67. updateProxyClientEndpoints(newConfigServer)
  68. } else {
  69. klog.Infof("⏭️ [CONFIG] server.config_server (RunInOmniagent mode): no change, skipping")
  70. }
  71. }
  72. }
  73. if v.IsSet("server.data_server") {
  74. newDataServer := v.GetString("server.data_server")
  75. oldDataServer := *flags.DataServer
  76. klog.Infof("📝 [CONFIG] server.data_server: config_file=%s, current=%s, flags_empty=%v",
  77. newDataServer, oldDataServer, *flags.DataServer == "")
  78. // 参考备份代码:只有当 *flags.DataServer == "" 时才从配置文件更新
  79. if *flags.DataServer == "" && !*flags.RunInOmniagent {
  80. if newDataServer != oldDataServer {
  81. *flags.DataServer = newDataServer
  82. klog.Infof("✅ [CONFIG] server.data_server UPDATED: %s -> %s", oldDataServer, newDataServer)
  83. } else {
  84. klog.Infof("⏭️ [CONFIG] server.data_server UNCHANGED: %s", newDataServer)
  85. }
  86. } else {
  87. klog.Infof("⏭️ [CONFIG] server.data_server SKIPPED (set via command line or RunInOmniagent mode)")
  88. }
  89. }
  90. if v.IsSet("server.server_prefix") {
  91. newVal := v.GetString("server.server_prefix")
  92. oldVal := *flags.ServerPrefix
  93. if *flags.ServerPrefix == "" {
  94. if newVal != oldVal {
  95. *flags.ServerPrefix = newVal
  96. klog.Infof("✅ [CONFIG] server.server_prefix UPDATED: %s -> %s", oldVal, newVal)
  97. }
  98. } else {
  99. klog.Infof("⏭️ [CONFIG] server.server_prefix SKIPPED (set via command line: %s)", *flags.ServerPrefix)
  100. }
  101. }
  102. if v.IsSet("server.license_key") {
  103. *flags.LicenseKey = v.GetString("server.license_key")
  104. }
  105. // Agent 配置
  106. if v.IsSet("agent.disable_register_host") {
  107. newVal := v.GetBool("agent.disable_register_host")
  108. oldVal := *flags.DisableRegisterHost
  109. // 布尔值:检查环境变量,如果没有设置环境变量,则从配置文件更新
  110. envSet := os.Getenv("EUSPACE_AGENT_DISABLE_REGISTER_HOST") != "" || os.Getenv("DISABLE_REG_HOST") != ""
  111. if !envSet {
  112. if newVal != oldVal {
  113. *flags.DisableRegisterHost = newVal
  114. klog.Infof("✅ [CONFIG] agent.disable_register_host UPDATED: %v -> %v", oldVal, newVal)
  115. }
  116. } else {
  117. klog.Infof("⏭️ [CONFIG] agent.disable_register_host SKIPPED (set via env)")
  118. }
  119. }
  120. if v.IsSet("agent.enable_license_check") {
  121. *flags.EnableLicenseCheck = v.GetBool("agent.enable_license_check")
  122. }
  123. if v.IsSet("agent.send_net_data") {
  124. *flags.SendNetData = v.GetBool("agent.send_net_data")
  125. }
  126. // Logging 配置
  127. if v.IsSet("logging.log_level") {
  128. newLogLevel := v.GetString("logging.log_level")
  129. oldLogLevel := *flags.LogLevel
  130. klog.Infof("📝 [CONFIG] logging.log_level: config_file=%s, current=%s, flags_empty=%v",
  131. newLogLevel, oldLogLevel, *flags.LogLevel == "")
  132. // 参考备份代码:只有当 *flags.LogLevel == "" 时才从配置文件更新 flags
  133. if *flags.LogLevel == "" {
  134. if newLogLevel != oldLogLevel {
  135. *flags.LogLevel = newLogLevel
  136. klog.Infof("✅ [CONFIG] logging.log_level UPDATED (flags): %s -> %s", oldLogLevel, newLogLevel)
  137. }
  138. } else {
  139. klog.Infof("⏭️ [CONFIG] logging.log_level SKIPPED (set via command line: %s)", *flags.LogLevel)
  140. }
  141. // 使用统一的热更新机制:比较配置文件的新旧值,如果改变了就更新 logrus 级别
  142. // 这样即使 *flags.LogLevel 是通过命令行设置的,配置文件改变时也能更新 logrus
  143. checkAndUpdateConfigValue("logging.log_level", newLogLevel, isHotReload, func() {
  144. // 初始加载时,如果 flags.LogLevel 为空,也要设置 logrus 级别
  145. if !isHotReload && *flags.LogLevel == "" {
  146. updateLogLevel(newLogLevel)
  147. } else if isHotReload {
  148. // 热更新时,无论 flags 是否更新,都更新 logrus 级别
  149. updateLogLevel(newLogLevel)
  150. }
  151. })
  152. }
  153. if v.IsSet("logging.console_log") {
  154. *flags.ConsoleLog = v.GetBool("logging.console_log")
  155. }
  156. }