manager.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. package config
  2. import (
  3. "encoding/json"
  4. "net/url"
  5. "os"
  6. "strings"
  7. "sync"
  8. "github.com/coroot/coroot-node-agent/flags"
  9. klog "github.com/sirupsen/logrus"
  10. "github.com/spf13/viper"
  11. )
  12. // Config 统一的配置结构体
  13. // 所有配置项都通过这个结构体访问,内部自动判断优先级
  14. type Config struct {
  15. mu sync.RWMutex
  16. // Viper 实例(用于读取配置文件)
  17. viper *viper.Viper
  18. // 命令行参数值(最高优先级)
  19. cmdLineValues map[string]interface{}
  20. // 环境变量值(第二优先级)
  21. envValues map[string]interface{}
  22. // 配置文件值(第三优先级)
  23. configFileValues map[string]interface{}
  24. // 默认值(最低优先级)
  25. defaultValues map[string]interface{}
  26. // 特殊配置:common.ini 中的值(最高优先级,仅用于 ConfigServer 和 DataServer)
  27. commonIniValues map[string]string
  28. }
  29. var (
  30. globalConfig *Config
  31. globalConfigOnce sync.Once
  32. )
  33. // Get 获取全局配置实例
  34. func Get() *Config {
  35. globalConfigOnce.Do(func() {
  36. globalConfig = &Config{
  37. cmdLineValues: make(map[string]interface{}),
  38. envValues: make(map[string]interface{}),
  39. configFileValues: make(map[string]interface{}),
  40. defaultValues: make(map[string]interface{}),
  41. commonIniValues: make(map[string]string),
  42. }
  43. })
  44. return globalConfig
  45. }
  46. // Init 初始化配置管理器
  47. // 必须在 flags.Parse() 之后调用
  48. func (c *Config) Init(viperInstance *viper.Viper) {
  49. c.mu.Lock()
  50. defer c.mu.Unlock()
  51. c.viper = viperInstance
  52. // 1. 收集命令行参数值(最高优先级)
  53. c.collectCmdLineValues()
  54. // 2. 收集环境变量值(第二优先级)
  55. c.collectEnvValues()
  56. // 3. 收集配置文件值(第三优先级)
  57. c.collectConfigFileValues()
  58. // 4. 收集默认值(最低优先级)
  59. c.collectDefaultValues()
  60. // 5. 收集 common.ini 中的值(特殊处理)
  61. c.collectCommonIniValues()
  62. // 6. 将配置文件中的值同步到 flags(使 *flags.XXX 在启动时也能反映配置文件优先级)
  63. c.syncFlagsValues()
  64. }
  65. // collectCmdLineValues 收集命令行参数值
  66. func (c *Config) collectCmdLineValues() {
  67. // 从 flags 包中读取命令行参数值
  68. c.cmdLineValues["server.config_server"] = *flags.ConfigServer
  69. c.cmdLineValues["server.data_server"] = *flags.DataServer
  70. c.cmdLineValues["server.server_prefix"] = *flags.ServerPrefix
  71. c.cmdLineValues["server.license_key"] = *flags.LicenseKey
  72. c.cmdLineValues["server.register_app_to_doop"] = *flags.RegisterAppToDoop
  73. c.cmdLineValues["agent.disable_e2e_tracing"] = *flags.DisableE2ETracing
  74. c.cmdLineValues["agent.disable_stack_tracing"] = *flags.DisableStackTracing
  75. c.cmdLineValues["agent.disable_l7_tracing"] = *flags.DisableL7Tracing
  76. c.cmdLineValues["agent.enable_elasticsearch_detection"] = *flags.EnableElasticsearchDetection
  77. c.cmdLineValues["agent.run_in_container"] = *flags.RunInContainer
  78. c.cmdLineValues["agent.run_in_omniagent"] = *flags.RunInOmniagent
  79. c.cmdLineValues["agent.disable_register_host"] = *flags.DisableRegisterHost
  80. c.cmdLineValues["agent.enable_license_check"] = *flags.EnableLicenseCheck
  81. c.cmdLineValues["agent.send_net_data"] = *flags.SendNetData
  82. c.cmdLineValues["network.listen_address"] = *flags.ListenAddress
  83. c.cmdLineValues["network.track_public_network"] = *flags.ExternalNetworksWhitelist
  84. c.cmdLineValues["network.ephemeral_port_range"] = *flags.EphemeralPortRange
  85. c.cmdLineValues["container.cgroupfs_root"] = *flags.CgroupRoot
  86. c.cmdLineValues["container.host_dir_path_prefix"] = *flags.HostDirPathPrefix
  87. c.cmdLineValues["container.disable_log_parsing"] = *flags.DisableLogParsing
  88. c.cmdLineValues["container.disable_pinger"] = *flags.DisablePinger
  89. c.cmdLineValues["logging.log_level"] = *flags.LogLevel
  90. c.cmdLineValues["logging.console_log"] = *flags.ConsoleLog
  91. c.cmdLineValues["logging.log_per_second"] = *flags.LogPerSecond
  92. c.cmdLineValues["logging.log_burst"] = *flags.LogBurst
  93. c.cmdLineValues["ebpf.ebpf_file_path"] = *flags.EbpfFilePath
  94. }
  95. // collectEnvValues 收集环境变量值
  96. func (c *Config) collectEnvValues() {
  97. // 环境变量映射表:环境变量名 -> 配置键
  98. envMap := map[string]string{
  99. // Server 配置
  100. "CONFIG_SERVER": "server.config_server",
  101. "EUSPACE_SERVER_CONFIG_SERVER": "server.config_server",
  102. "DATA_SERVER": "server.data_server",
  103. "EUSPACE_SERVER_DATA_SERVER": "server.data_server",
  104. "SERVER_PREFIX": "server.server_prefix",
  105. "EUSPACE_SERVER_SERVER_PREFIX": "server.server_prefix",
  106. "LICENSE_KEY": "server.license_key",
  107. "EUSPACE_SERVER_LICENSE_KEY": "server.license_key",
  108. "REGISTER_APP_TO_DOOP": "server.register_app_to_doop",
  109. "EUSPACE_SERVER_REGISTER_APP_TO_DOOP": "server.register_app_to_doop",
  110. // Agent 配置
  111. "DISABLE_E2E_TRACING": "agent.disable_e2e_tracing",
  112. "EUSPACE_AGENT_DISABLE_E2E_TRACING": "agent.disable_e2e_tracing",
  113. "DISABLE_STACK_TRACING": "agent.disable_stack_tracing",
  114. "EUSPACE_AGENT_DISABLE_STACK_TRACING": "agent.disable_stack_tracing",
  115. "DISABLE_L7_TRACING": "agent.disable_l7_tracing",
  116. "EUSPACE_AGENT_DISABLE_L7_TRACING": "agent.disable_l7_tracing",
  117. "ENABLE_ES": "agent.enable_elasticsearch_detection",
  118. "EUSPACE_AGENT_ENABLE_ELASTICSEARCH_DETECTION": "agent.enable_elasticsearch_detection",
  119. "RUN_IN_CONTAINER": "agent.run_in_container",
  120. "EUSPACE_AGENT_RUN_IN_CONTAINER": "agent.run_in_container",
  121. "RUN_IN_OMNIAGENT": "agent.run_in_omniagent",
  122. "EUSPACE_AGENT_RUN_IN_OMNIAGENT": "agent.run_in_omniagent",
  123. "DISABLE_REG_HOST": "agent.disable_register_host",
  124. "EUSPACE_AGENT_DISABLE_REGISTER_HOST": "agent.disable_register_host",
  125. "ENABLE_LICENSE_CHECK": "agent.enable_license_check",
  126. "EUSPACE_AGENT_ENABLE_LICENSE_CHECK": "agent.enable_license_check",
  127. "SEND_NET_DATA": "agent.send_net_data",
  128. "EUSPACE_AGENT_SEND_NET_DATA": "agent.send_net_data",
  129. // Network 配置
  130. "LISTEN": "network.listen_address",
  131. "EUSPACE_NETWORK_LISTEN_ADDRESS": "network.listen_address",
  132. "TRACK_PUBLIC_NETWORK": "network.track_public_network",
  133. "EUSPACE_NETWORK_TRACK_PUBLIC_NETWORK": "network.track_public_network",
  134. "EPHEMERAL_PORT_RANGE": "network.ephemeral_port_range",
  135. "EUSPACE_NETWORK_EPHEMERAL_PORT_RANGE": "network.ephemeral_port_range",
  136. // Container 配置
  137. "CGROUPFS_ROOT": "container.cgroupfs_root",
  138. "EUSPACE_CONTAINER_CGROUPFS_ROOT": "container.cgroupfs_root",
  139. "HOST_DIR_PATH_PREFIX": "container.host_dir_path_prefix",
  140. "EUSPACE_CONTAINER_HOST_DIR_PATH_PREFIX": "container.host_dir_path_prefix",
  141. "DISABLE_LOG_PARSING": "container.disable_log_parsing",
  142. "EUSPACE_CONTAINER_DISABLE_LOG_PARSING": "container.disable_log_parsing",
  143. "DISABLE_PINGER": "container.disable_pinger",
  144. "EUSPACE_CONTAINER_DISABLE_PINGER": "container.disable_pinger",
  145. // Logging 配置
  146. "LOG_LEVEL": "logging.log_level",
  147. "EUSPACE_LOGGING_LOG_LEVEL": "logging.log_level",
  148. "CONSOLE_LOG": "logging.console_log",
  149. "EUSPACE_LOGGING_CONSOLE_LOG": "logging.console_log",
  150. "LOG_PER_SECOND": "logging.log_per_second",
  151. "EUSPACE_LOGGING_LOG_PER_SECOND": "logging.log_per_second",
  152. "LOG_BURST": "logging.log_burst",
  153. "EUSPACE_LOGGING_LOG_BURST": "logging.log_burst",
  154. // eBPF 配置
  155. "EBPF_FILE": "ebpf.ebpf_file_path",
  156. "EUSPACE_EBPF_EBPF_FILE_PATH": "ebpf.ebpf_file_path",
  157. // Cloud 配置
  158. "PROVIDER": "cloud.provider",
  159. "EUSPACE_CLOUD_PROVIDER": "cloud.provider",
  160. "REGION": "cloud.region",
  161. "EUSPACE_CLOUD_REGION": "cloud.region",
  162. "AVAILABILITY_ZONE": "cloud.availability_zone",
  163. "EUSPACE_CLOUD_AVAILABILITY_ZONE": "cloud.availability_zone",
  164. "INSTANCE_TYPE": "cloud.instance_type",
  165. "EUSPACE_CLOUD_INSTANCE_TYPE": "cloud.instance_type",
  166. "INSTANCE_LIFE_CYCLE": "cloud.instance_life_cycle",
  167. "EUSPACE_CLOUD_INSTANCE_LIFE_CYCLE": "cloud.instance_life_cycle",
  168. }
  169. for envKey, configKey := range envMap {
  170. if val := os.Getenv(envKey); val != "" {
  171. c.envValues[configKey] = val
  172. }
  173. }
  174. }
  175. // collectConfigFileValues 收集配置文件值
  176. func (c *Config) collectConfigFileValues() {
  177. if c.viper == nil {
  178. return
  179. }
  180. // 从 Viper 中读取所有配置项
  181. allKeys := c.viper.AllKeys()
  182. for _, key := range allKeys {
  183. if c.viper.IsSet(key) {
  184. c.configFileValues[key] = c.viper.Get(key)
  185. }
  186. }
  187. }
  188. // collectDefaultValues 收集默认值
  189. func (c *Config) collectDefaultValues() {
  190. // 默认值定义
  191. c.defaultValues["server.config_server"] = ""
  192. c.defaultValues["server.data_server"] = ""
  193. c.defaultValues["server.server_prefix"] = ""
  194. c.defaultValues["server.license_key"] = "J45Engw88NeHUZ4Q7qNsK8L47FTH**QvgW113IEnsNaBNMR5zZ**oj/g!!!!"
  195. c.defaultValues["server.register_app_to_doop"] = false
  196. c.defaultValues["agent.disable_e2e_tracing"] = true
  197. c.defaultValues["agent.disable_stack_tracing"] = true
  198. c.defaultValues["agent.disable_l7_tracing"] = false
  199. c.defaultValues["agent.enable_elasticsearch_detection"] = false
  200. c.defaultValues["agent.run_in_container"] = false
  201. c.defaultValues["agent.run_in_omniagent"] = false
  202. c.defaultValues["agent.disable_register_host"] = false
  203. c.defaultValues["agent.enable_license_check"] = true
  204. c.defaultValues["agent.send_net_data"] = false
  205. c.defaultValues["network.listen_address"] = "0.0.0.0:8123"
  206. c.defaultValues["network.track_public_network"] = []string{"0.0.0.0/0"}
  207. c.defaultValues["network.ephemeral_port_range"] = ""
  208. c.defaultValues["container.cgroupfs_root"] = "/sys/fs/cgroup"
  209. c.defaultValues["container.host_dir_path_prefix"] = ""
  210. c.defaultValues["container.disable_log_parsing"] = true
  211. c.defaultValues["container.disable_pinger"] = false
  212. c.defaultValues["logging.log_level"] = "info"
  213. c.defaultValues["logging.console_log"] = false
  214. c.defaultValues["logging.log_per_second"] = 10.0
  215. c.defaultValues["logging.log_burst"] = 100
  216. c.defaultValues["ebpf.ebpf_file_path"] = ""
  217. }
  218. // collectCommonIniValues 收集 common.ini 中的值
  219. func (c *Config) collectCommonIniValues() {
  220. if !*flags.RunInOmniagent || *flags.CommonIni == "" {
  221. return
  222. }
  223. // 从 common.ini 加载 ConfigServer 和 DataServer
  224. // 这个逻辑已经在 flags.go 的 init() 中执行了
  225. // 这里我们只是记录一下
  226. if *flags.ConfigServer != "" {
  227. c.commonIniValues["server.config_server"] = *flags.ConfigServer
  228. }
  229. if *flags.DataServer != "" {
  230. c.commonIniValues["server.data_server"] = *flags.DataServer
  231. }
  232. }
  233. // getValue 获取配置值(自动判断优先级)
  234. // 优先级:common.ini > 环境变量(非空)> 配置文件(非空)> 默认值
  235. func (c *Config) getValue(key string) interface{} {
  236. c.mu.RLock()
  237. defer c.mu.RUnlock()
  238. // 1. 最高优先级:common.ini 中的值(仅用于 ConfigServer 和 DataServer)
  239. if val, ok := c.commonIniValues[key]; ok {
  240. if val != "" {
  241. return val
  242. }
  243. }
  244. // 2. 环境变量(如果值不为空)
  245. if envVal, ok := c.envValues[key]; ok {
  246. // 检查环境变量值是否为空
  247. if strVal, ok := envVal.(string); ok {
  248. if strVal != "" {
  249. if strVal == "true" {
  250. return true
  251. } else if strVal == "false" {
  252. return false
  253. }
  254. return envVal
  255. }
  256. } else {
  257. // 非字符串类型,直接返回
  258. return envVal
  259. }
  260. }
  261. // 3. 配置文件(如果值不为空)
  262. if configVal, ok := c.configFileValues[key]; ok {
  263. // 检查配置文件值是否为空
  264. if strVal, ok := configVal.(string); ok {
  265. if strVal != "" {
  266. return configVal
  267. }
  268. } else {
  269. // 非字符串类型,直接返回
  270. return configVal
  271. }
  272. }
  273. // flags 中的值
  274. if cmdVal, ok := c.cmdLineValues[key]; ok {
  275. return cmdVal
  276. }
  277. // 默认值
  278. if defaultVal, ok := c.defaultValues[key]; ok {
  279. return defaultVal
  280. }
  281. return nil
  282. }
  283. // Reload 重新加载配置(用于热更新)
  284. func (c *Config) Reload() {
  285. c.mu.Lock()
  286. defer c.mu.Unlock()
  287. // 重新收集配置文件值
  288. c.collectConfigFileValues()
  289. // 重新收集 common.ini 值
  290. c.collectCommonIniValues()
  291. // 同步更新 flags 中的值,确保使用 *flags.XXX 的地方也能获取到最新值
  292. c.syncFlagsValues()
  293. }
  294. // syncFlagsValues 同步更新 flags 中的值
  295. // 这样即使代码使用 *flags.XXX,也能在热更新后获取到新值
  296. // 注意:调用此方法时,必须已经持有 c.mu 写锁
  297. func (c *Config) syncFlagsValues() {
  298. if c.viper == nil {
  299. return
  300. }
  301. // 更新所有可以通过配置文件设置的 flags 值
  302. // 注意:只更新那些没有被命令行参数或环境变量设置的配置项
  303. // 注意:这里直接访问内部字段,不调用 getValue(),避免死锁(因为调用者已经持有写锁)
  304. // Server 配置
  305. if c.viper.IsSet("server.config_server") {
  306. // 直接访问内部字段,按优先级顺序检查
  307. if val, ok := c.commonIniValues["server.config_server"]; ok && val != "" {
  308. *flags.ConfigServer = val
  309. } else if envVal, ok := c.envValues["server.config_server"]; ok {
  310. if s, ok := envVal.(string); ok && s != "" {
  311. *flags.ConfigServer = s
  312. }
  313. } else if configVal, ok := c.configFileValues["server.config_server"]; ok {
  314. if s, ok := configVal.(string); ok && s != "" {
  315. *flags.ConfigServer = s
  316. }
  317. }
  318. }
  319. if c.viper.IsSet("server.data_server") {
  320. if val, ok := c.commonIniValues["server.data_server"]; ok && val != "" {
  321. *flags.DataServer = val
  322. } else if envVal, ok := c.envValues["server.data_server"]; ok {
  323. if s, ok := envVal.(string); ok && s != "" {
  324. *flags.DataServer = s
  325. }
  326. } else if configVal, ok := c.configFileValues["server.data_server"]; ok {
  327. if s, ok := configVal.(string); ok && s != "" {
  328. *flags.DataServer = s
  329. }
  330. }
  331. }
  332. // 辅助函数:按优先级获取值(不获取锁,因为调用者已持有写锁)
  333. getValueUnsafe := func(key string) interface{} {
  334. // 1. common.ini(最高优先级)
  335. if val, ok := c.commonIniValues[key]; ok && val != "" {
  336. return val
  337. }
  338. // 2. 环境变量
  339. if envVal, ok := c.envValues[key]; ok {
  340. if strVal, ok := envVal.(string); ok {
  341. if strVal != "" {
  342. return envVal
  343. }
  344. } else {
  345. return envVal
  346. }
  347. }
  348. // 3. 配置文件
  349. if configVal, ok := c.configFileValues[key]; ok {
  350. if strVal, ok := configVal.(string); ok {
  351. if strVal != "" {
  352. return configVal
  353. }
  354. } else {
  355. return configVal
  356. }
  357. }
  358. // 4. 默认值
  359. if defaultVal, ok := c.defaultValues[key]; ok {
  360. return defaultVal
  361. }
  362. return nil
  363. }
  364. if c.viper.IsSet("server.server_prefix") {
  365. if val := getValueUnsafe("server.server_prefix"); val != nil {
  366. if s, ok := val.(string); ok {
  367. *flags.ServerPrefix = s
  368. // 重新计算 TracesEndpoint,使 /data/receive 也使用更新后的前缀
  369. dataServer := *flags.DataServer
  370. if dataServer != "" {
  371. if !strings.HasPrefix(dataServer, "http") {
  372. dataServer = "http://" + dataServer
  373. }
  374. if u, err := url.Parse(dataServer); err == nil && u != nil {
  375. *flags.TracesEndpoint = u.JoinPath(s + "/api/v2/data/receive")
  376. }
  377. }
  378. }
  379. }
  380. }
  381. if c.viper.IsSet("server.license_key") {
  382. if val := getValueUnsafe("server.license_key"); val != nil {
  383. if s, ok := val.(string); ok {
  384. *flags.LicenseKey = s
  385. }
  386. }
  387. }
  388. // Logging 配置
  389. if c.viper.IsSet("logging.log_level") {
  390. if val := getValueUnsafe("logging.log_level"); val != nil {
  391. if s, ok := val.(string); ok {
  392. *flags.LogLevel = s
  393. }
  394. }
  395. }
  396. if c.viper.IsSet("logging.console_log") {
  397. if val := getValueUnsafe("logging.console_log"); val != nil {
  398. if b, ok := val.(bool); ok {
  399. *flags.ConsoleLog = b
  400. }
  401. }
  402. }
  403. // Agent 配置
  404. if c.viper.IsSet("agent.disable_e2e_tracing") {
  405. if val := getValueUnsafe("agent.disable_e2e_tracing"); val != nil {
  406. if b, ok := val.(bool); ok {
  407. *flags.DisableE2ETracing = b
  408. }
  409. }
  410. }
  411. if c.viper.IsSet("agent.disable_stack_tracing") {
  412. if val := getValueUnsafe("agent.disable_stack_tracing"); val != nil {
  413. if b, ok := val.(bool); ok {
  414. *flags.DisableStackTracing = b
  415. }
  416. }
  417. }
  418. if c.viper.IsSet("agent.disable_l7_tracing") {
  419. if val := getValueUnsafe("agent.disable_l7_tracing"); val != nil {
  420. if b, ok := val.(bool); ok {
  421. *flags.DisableL7Tracing = b
  422. }
  423. }
  424. }
  425. if c.viper.IsSet("agent.disable_register_host") {
  426. if val := getValueUnsafe("agent.disable_register_host"); val != nil {
  427. if b, ok := val.(bool); ok {
  428. *flags.DisableRegisterHost = b
  429. }
  430. }
  431. }
  432. if c.viper.IsSet("agent.enable_license_check") {
  433. if val := getValueUnsafe("agent.enable_license_check"); val != nil {
  434. if b, ok := val.(bool); ok {
  435. *flags.EnableLicenseCheck = b
  436. }
  437. }
  438. }
  439. if c.viper.IsSet("agent.send_net_data") {
  440. if val := getValueUnsafe("agent.send_net_data"); val != nil {
  441. if b, ok := val.(bool); ok {
  442. *flags.SendNetData = b
  443. }
  444. }
  445. }
  446. // Network 配置
  447. if c.viper.IsSet("network.listen_address") {
  448. if val := getValueUnsafe("network.listen_address"); val != nil {
  449. if s, ok := val.(string); ok {
  450. *flags.ListenAddress = s
  451. }
  452. }
  453. }
  454. // Container 配置
  455. if c.viper.IsSet("container.cgroupfs_root") {
  456. if val := getValueUnsafe("container.cgroupfs_root"); val != nil {
  457. if s, ok := val.(string); ok {
  458. *flags.CgroupRoot = s
  459. }
  460. }
  461. }
  462. // 注意:这里只更新了部分常用的配置项
  463. // 如果需要更新其他配置项,可以继续添加
  464. }
  465. // 便捷方法:获取各种类型的配置值
  466. func (c *Config) LogLevel() string {
  467. val := c.getValue("logging.log_level")
  468. if s, ok := val.(string); ok && s != "" {
  469. return s
  470. }
  471. return "info"
  472. }
  473. func (c *Config) ConsoleLog() bool {
  474. val := c.getValue("logging.console_log")
  475. if b, ok := val.(bool); ok {
  476. return b
  477. }
  478. return false
  479. }
  480. func (c *Config) ConfigServer() string {
  481. val := c.getValue("server.config_server")
  482. if s, ok := val.(string); ok {
  483. return s
  484. }
  485. return ""
  486. }
  487. func (c *Config) DataServer() string {
  488. val := c.getValue("server.data_server")
  489. if s, ok := val.(string); ok {
  490. return s
  491. }
  492. return ""
  493. }
  494. func (c *Config) ServerPrefix() string {
  495. val := c.getValue("server.server_prefix")
  496. if s, ok := val.(string); ok {
  497. return s
  498. }
  499. return ""
  500. }
  501. func (c *Config) LicenseKey() string {
  502. val := c.getValue("server.license_key")
  503. if s, ok := val.(string); ok {
  504. return s
  505. }
  506. return "J45Engw88NeHUZ4Q7qNsK8L47FTH**QvgW113IEnsNaBNMR5zZ**oj/g!!!!"
  507. }
  508. func (c *Config) DisableRegisterHost() bool {
  509. val := c.getValue("agent.disable_register_host")
  510. if b, ok := val.(bool); ok {
  511. return b
  512. }
  513. return false
  514. }
  515. func (c *Config) EnableLicenseCheck() bool {
  516. val := c.getValue("agent.enable_license_check")
  517. if b, ok := val.(bool); ok {
  518. return b
  519. }
  520. return true
  521. }
  522. func (c *Config) SendNetData() bool {
  523. val := c.getValue("agent.send_net_data")
  524. if b, ok := val.(bool); ok {
  525. return b
  526. }
  527. return false
  528. }
  529. func (c *Config) DisableE2ETracing() bool {
  530. val := c.getValue("agent.disable_e2e_tracing")
  531. if b, ok := val.(bool); ok {
  532. return b
  533. }
  534. return true
  535. }
  536. func (c *Config) DisableStackTracing() bool {
  537. val := c.getValue("agent.disable_stack_tracing")
  538. if b, ok := val.(bool); ok {
  539. return b
  540. }
  541. return true
  542. }
  543. func (c *Config) DisableL7Tracing() bool {
  544. val := c.getValue("agent.disable_l7_tracing")
  545. if b, ok := val.(bool); ok {
  546. return b
  547. }
  548. return false
  549. }
  550. func (c *Config) RunInContainer() bool {
  551. val := c.getValue("agent.run_in_container")
  552. if b, ok := val.(bool); ok {
  553. return b
  554. }
  555. return false
  556. }
  557. func (c *Config) RunInOmniagent() bool {
  558. // RunInOmniagent 不支持热更新,直接从 flags 获取
  559. return *flags.RunInOmniagent
  560. }
  561. func (c *Config) ListenAddress() string {
  562. val := c.getValue("network.listen_address")
  563. if s, ok := val.(string); ok {
  564. return s
  565. }
  566. return "0.0.0.0:8123"
  567. }
  568. func (c *Config) CgroupRoot() string {
  569. val := c.getValue("container.cgroupfs_root")
  570. if s, ok := val.(string); ok {
  571. return s
  572. }
  573. return "/sys/fs/cgroup"
  574. }
  575. // AgentRule 配置文件 agent.rules 中的单条规则
  576. type AgentRule struct {
  577. AppName string `json:"app_name"`
  578. RuleType int `json:"rule_type"`
  579. Filters string `json:"filters"`
  580. }
  581. // AgentRules 从配置文件读取 agent.rules JSON 字符串,解析后返回规则列表
  582. // 若未配置或解析失败,返回 nil
  583. func (c *Config) AgentRules() []AgentRule {
  584. val := c.getValue("agent.rules")
  585. if val == nil {
  586. return nil
  587. }
  588. s, ok := val.(string)
  589. if !ok || s == "" {
  590. return nil
  591. }
  592. var rules []AgentRule
  593. if err := json.Unmarshal([]byte(s), &rules); err != nil {
  594. klog.Errorf("failed to parse agent.rules: %v", err)
  595. return nil
  596. }
  597. return rules
  598. }
  599. // TracesEndpoint 获取 TracesEndpoint
  600. // 优先级:命令行参数/环境变量 > 根据 DataServer 和 ServerPrefix 计算
  601. // 如果都为空,返回 nil
  602. func (c *Config) TracesEndpoint() *url.URL {
  603. // 1. 优先使用命令行参数或环境变量设置的 TracesEndpoint
  604. if *flags.TracesEndpoint != nil {
  605. return *flags.TracesEndpoint
  606. }
  607. // 2. 如果 TracesEndpoint 未设置,根据 DataServer 和 ServerPrefix 计算
  608. dataServer := c.DataServer()
  609. if dataServer == "" {
  610. return nil
  611. }
  612. // 如果 DataServer 没有 http/https 前缀,添加 http://
  613. dataServerStr := dataServer
  614. if !strings.HasPrefix(dataServerStr, "http://") && !strings.HasPrefix(dataServerStr, "https://") {
  615. dataServerStr = "http://" + dataServerStr
  616. }
  617. // 解析 DataServer URL
  618. dataServerURL, err := url.Parse(dataServerStr)
  619. if err != nil || dataServerURL == nil {
  620. return nil
  621. }
  622. // 构建 TracesEndpoint:DataServer + ServerPrefix + "/api/v2/data/receive"
  623. serverPrefix := c.ServerPrefix()
  624. path := serverPrefix + "/api/v2/data/receive"
  625. return dataServerURL.JoinPath(path)
  626. }