flags.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package flags
  2. import (
  3. "fmt"
  4. "net/url"
  5. "os"
  6. "strings"
  7. "github.com/common-nighthawk/go-figure"
  8. "gopkg.in/alecthomas/kingpin.v2"
  9. "gopkg.in/ini.v1"
  10. )
  11. var (
  12. // apm
  13. ConfigServer = kingpin.Flag("config-server", "The URL of the endpoint to send traces to").Envar("CONFIG_SERVER").Default("").String()
  14. DataServer = kingpin.Flag("data-server", "The URL of the endpoint to send traces to").Envar("DATA_SERVER").Default("").String()
  15. DumpApps = kingpin.Flag("dump", "Dump app snap").Short('d').Default("false").Bool()
  16. DumpRules = kingpin.Flag("dr", "Dump rule snap").Default("false").Bool()
  17. PrintFormat = kingpin.Flag("output", "Output format (table|json)").Short('o').Default("table").String()
  18. Version = kingpin.Flag("version", "show app version").Short('v').Bool()
  19. LogLevel = kingpin.Flag("log-level", "Log level").Envar("LOG_LEVEL").Default("").String()
  20. ConsoleLog = kingpin.Flag("console-log", "Console log").Envar("CONSOLE_LOG").Default("false").Bool()
  21. EbpfFilePath = kingpin.Flag("ebpf-path", "Set ebpf file path").Envar("EBPF_FILE").Default("").String()
  22. CommonIni = kingpin.Flag("common.ini", "Set ebpf file path").Envar("COMMON_INI").Default("/opt/cloudwise/omniagent/conf/common.ini").String()
  23. ServerPrefix = kingpin.Flag("server-prefix", "server-prefix").Envar("SERVER_PREFIX").Default("").String()
  24. DisableRegisterHost = kingpin.Flag("disable-reg-host", "Disable reg host").Default("false").Envar("DISABLE_REG_HOST").Bool()
  25. // agent
  26. DisableE2ETracing = kingpin.Flag("disable-e2e-tracing", "Disable e2e tracing").Default("true").Envar("DISABLE_E2E_TRACING").Bool()
  27. DisableStackTracing = kingpin.Flag("disable-stack-tracing", "Disable stack tracing").Default("true").Envar("DISABLE_STACK_TRACING").Bool()
  28. LicenseKey = kingpin.Flag("license-key", "Apm API key").Default("J45Engw88NeHUZ4Q7qNsK8L47FTH**QvgW113IEnsNaBNMR5zZ**oj/g!!!!").Envar("LICENSE_KEY").String()
  29. RunInContainer = kingpin.Flag("run-in-container", "run in container").Default("false").Envar("RUN_IN_CONTAINER").Bool()
  30. RunInOmniagent = kingpin.Flag("run-in-omniagent", "run in omniagent").Default("false").Envar("RUN_IN_OMNIAGENT").Bool()
  31. ListenAddress = kingpin.Flag("listen", "Listen address - ip:port or :port").Default("0.0.0.0:8123").Envar("LISTEN").String()
  32. CgroupRoot = kingpin.Flag("cgroupfs-root", "The mount point of the host cgroupfs root").Default("/sys/fs/cgroup").Envar("CGROUPFS_ROOT").String()
  33. DisableLogParsing = kingpin.Flag("disable-log-parsing", "Disable container log parsing").Default("true").Envar("DISABLE_LOG_PARSING").Bool()
  34. DisablePinger = kingpin.Flag("disable-pinger", "Don't ping upstreams").Default("false").Envar("DISABLE_PINGER").Bool()
  35. DisableL7Tracing = kingpin.Flag("disable-l7-tracing", "Disable L7 tracing").Default("false").Envar("DISABLE_L7_TRACING").Bool()
  36. EnableElasticsearchDetection = kingpin.Flag("enable-es", "Enable Elasticsearch detection in HTTP requests").Default("false").Envar("ENABLE_ES").Bool()
  37. ExternalNetworksWhitelist = kingpin.
  38. Flag("track-public-network", "Allow track connections to the specified IP networks, all private networks are allowed by default (e.g., Y.Y.Y.Y/mask)").
  39. Envar("TRACK_PUBLIC_NETWORK").
  40. Default("0.0.0.0/0").
  41. Strings()
  42. EphemeralPortRange = kingpin.Flag("ephemeral-port-range", "Destination and Listen TCP ports from this range will be skipped").Default("").Envar("EPHEMERAL_PORT_RANGE").String()
  43. Provider = kingpin.Flag("provider", "`provider` label for `node_cloud_info` metric").Envar("PROVIDER").String()
  44. Region = kingpin.Flag("region", "`region` label for `node_cloud_info` metric").Envar("REGION").String()
  45. AvailabilityZone = kingpin.Flag("availability-zone", "`availability_zone` label for `node_cloud_info` metric").Envar("AVAILABILITY_ZONE").String()
  46. InstanceType = kingpin.Flag("instance-type", "`instance_type` label for `node_cloud_info` metric").Envar("INSTANCE_TYPE").String()
  47. InstanceLifeCycle = kingpin.Flag("instance-life-cycle", "`instance_life_cycle` label for `node_cloud_info` metric").Envar("INSTANCE_LIFE_CYCLE").String()
  48. LogPerSecond = kingpin.Flag("log-per-second", "The number of logs per second").Default("10.0").Envar("LOG_PER_SECOND").Float64()
  49. LogBurst = kingpin.Flag("log-burst", "The maximum number of tokens that can be consumed in a single call to allow").Default("100").Envar("LOG_BURST").Int()
  50. CollectorEndpoint = kingpin.Flag("collector-endpoint", "A base endpoint URL for metrics, traces, logs, and profiles").Envar("COLLECTOR_ENDPOINT").URL()
  51. ApiKey = kingpin.Flag("api-key", "Coroot API key").Envar("API_KEY").String()
  52. MetricsEndpoint = kingpin.Flag("metrics-endpoint", "The URL of the endpoint to send metrics to").Envar("METRICS_ENDPOINT").URL()
  53. TracesEndpoint = kingpin.Flag("traces-endpoint", "The URL of the endpoint to send traces to").Envar("TRACES_ENDPOINT").URL()
  54. LogsEndpoint = kingpin.Flag("logs-endpoint", "The URL of the endpoint to send logs to").Envar("LOGS_ENDPOINT").URL()
  55. ProfilesEndpoint = kingpin.Flag("profiles-endpoint", "The URL of the endpoint to send profiles to").Envar("PROFILES_ENDPOINT").URL()
  56. InsecureSkipVerify = kingpin.Flag("insecure-skip-verify", "whether to skip verifying the certificate or not").Envar("INSECURE_SKIP_VERIFY").Default("false").Bool()
  57. TracesCompression = kingpin.Flag("traces-compression", "Compression algorithm for traces (none|gzip|zstd)").Envar("TRACES_COMPRESSION").Default("zstd").String()
  58. ScrapeInterval = kingpin.Flag("scrape-interval", "How often to gather metrics from the agent").Default("15s").Envar("SCRAPE_INTERVAL").Duration()
  59. WalDir = kingpin.Flag("wal-dir", "Path to where the agent stores data (e.g. the metrics Write-Ahead Log)").Default("/tmp/coroot-node-agent").Envar("WAL_DIR").String()
  60. HostDirPathPrefix = kingpin.Flag("host-dir-path-prefix", "Set the prefix of path about the mount point of the host directory").Envar("HOST_DIR_PATH_PREFIX").Default("").String()
  61. FuseTryMax = kingpin.Flag("fuse_try_max", "The maximum number of the fuse operation try").Default("3").Envar("FUSE_TRY_MAX").Int()
  62. L4HeaderCodeTypes = kingpin.Flag("l4-header", "L4 header code types (e.g., python,node,ruby)").Envar("L4_HEADER_CODE_TYPES").Default("python,node").String()
  63. DisableL4Cwother = kingpin.Flag("disable-l4-cwother", "Disable L4 cwother header injection").Envar("DISABLE_L4_CWOTHER").Default("false").Bool()
  64. // debug
  65. Test = kingpin.Flag("test", "Only test").Default("false").Envar("TEST").Bool()
  66. // op 新增配置
  67. SysTag = kingpin.Flag("sys-tag", "sys tag").Envar("CW_SYS").Default("").String()
  68. // l7
  69. MysqlDefault = kingpin.Flag("mysql-default", "Default MySQL protocol when port-based detection fails").Envar("MYSQL_DEFAULT").Default("mysql").String()
  70. // 端口白名单配置
  71. MysqlPortWhitelist = kingpin.Flag("mysql-ports", "Comma-separated list of ports to identify as MySQL").Envar("MYSQL_PORTS").Default("").String()
  72. MariadbPortWhitelist = kingpin.Flag("mariadb-ports", "Comma-separated list of ports to identify as MariaDB").Envar("MARIADB_PORTS").Default("").String()
  73. TidbPortWhitelist = kingpin.Flag("tidb-ports", "Comma-separated list of ports to identify as TiDB").Envar("TIDB_PORTS").Default("").String()
  74. //APP注册到DOOP
  75. RegisterAppToDoop = kingpin.Flag("register-app-to-doop", "Register the app-info to the doop").Default("false").Envar("REGISTER_APP_TO_DOOP").Bool()
  76. //是否向平台发送网络数据
  77. SendNetData = kingpin.Flag("send-net-data", "Send the net data to platform").Default("false").Envar("SEND_NET_DATA").Bool()
  78. //是否开启License校验逻辑
  79. EnableLicenseCheck = kingpin.Flag("enable-license-check", "Enable license check and quota validation").Default("true").Envar("ENABLE_LICENSE_CHECK").Bool()
  80. //配置文件路径
  81. ConfigFile = kingpin.Flag("config", "Path to configuration file").Envar("EUSPACE_CONFIG").Default("").String()
  82. )
  83. var AgentName = "euspace"
  84. var AgentVersion = "0.0.1"
  85. var GitCommit = ""
  86. var BuildDate = ""
  87. func GetString(fl *string) string {
  88. if fl == nil {
  89. return ""
  90. }
  91. return *fl
  92. }
  93. // IsL4HeaderEnabled 返回给定语言是否在 --l4-header 列表中。
  94. // lang 不区分大小写,如 "java"、"python"、"node"。
  95. func IsL4HeaderEnabled(lang string) bool {
  96. if L4HeaderCodeTypes == nil {
  97. return false
  98. }
  99. lower := strings.ToLower(lang)
  100. for _, part := range strings.Split(*L4HeaderCodeTypes, ",") {
  101. if strings.TrimSpace(strings.ToLower(part)) == lower {
  102. return true
  103. }
  104. }
  105. return false
  106. }
  107. func init() {
  108. if strings.HasSuffix(os.Args[0], ".test") {
  109. return
  110. }
  111. kingpin.HelpFlag.Short('h').Hidden()
  112. kingpin.Parse()
  113. if *Test {
  114. euspace := figure.NewFigure("TEST", "", true)
  115. // 只在用户未显式设置时才应用 test 模式的默认值
  116. if os.Getenv("DISABLE_REG_HOST") == "" {
  117. *DisableRegisterHost = true
  118. }
  119. if os.Getenv("DISABLE_E2E_TRACING") == "" {
  120. *DisableE2ETracing = false
  121. }
  122. *ConsoleLog = true
  123. *LogLevel = "debug"
  124. *EnableLicenseCheck = false
  125. euspace.Print()
  126. } else {
  127. euspace := figure.NewColorFigure("Euspace", "slant", "blue", true)
  128. euspace.Print()
  129. }
  130. if *Version {
  131. ShowVersion()
  132. }
  133. if *DumpApps {
  134. DumpTableFeatures(*PrintFormat)
  135. }
  136. if *DumpRules {
  137. DumpRuleTableFeatures(*PrintFormat)
  138. }
  139. if *CollectorEndpoint != nil {
  140. u := *CollectorEndpoint
  141. if *MetricsEndpoint == nil {
  142. *MetricsEndpoint = u.JoinPath("/v1/metrics")
  143. }
  144. if *TracesEndpoint == nil {
  145. *TracesEndpoint = u.JoinPath("/v1/traces")
  146. }
  147. if *LogsEndpoint == nil {
  148. *LogsEndpoint = u.JoinPath("/v1/logs")
  149. }
  150. if *ProfilesEndpoint == nil {
  151. *ProfilesEndpoint = u.JoinPath("/v1/profiles")
  152. }
  153. }
  154. if *MetricsEndpoint != nil {
  155. *ListenAddress = "127.0.0.1:10300"
  156. }
  157. // set ServerPrefix
  158. // set ConfigServer
  159. // set DataServer
  160. // 注意:ConfigServer 和 DataServer 的最高优先级是 common.ini(如果 RunInOmniagent 为 true)
  161. // 这个逻辑在 flags.go 的 init() 中执行,确保在 Viper 配置加载之前就设置了
  162. if *RunInOmniagent {
  163. // omni 模式下,account_id 从 common.ini 的 token 解析,不需要通过 RegisterHost 获取
  164. if os.Getenv("DISABLE_REG_HOST") == "" {
  165. *DisableRegisterHost = true
  166. }
  167. iniData, err := ini.Load(*CommonIni)
  168. if err == nil && iniData != nil {
  169. *ServerPrefix = "/apm"
  170. configServer := iniData.Section("common").Key("config_server").String()
  171. dataServer := iniData.Section("common").Key("data_server").String()
  172. if configServer != "" {
  173. *ConfigServer = configServer
  174. }
  175. if dataServer != "" {
  176. *DataServer = dataServer
  177. }
  178. }
  179. }
  180. // set TracesEndpoint
  181. if *TracesEndpoint == nil && *DataServer != "" {
  182. if !strings.HasPrefix(*DataServer, "http") {
  183. *DataServer = fmt.Sprintf("http://%s", *DataServer)
  184. }
  185. dataServer, err := url.Parse(*DataServer)
  186. if err == nil && dataServer != nil {
  187. *TracesEndpoint = dataServer.JoinPath(*ServerPrefix + "/api/v2/data/receive")
  188. }
  189. }
  190. // set tiny-agent config
  191. //nativeConf := utils.GetDefaultAgentsPath("NativeAgent", "conf", "agent.properties")
  192. //confData, err := ini.Load(nativeConf)
  193. //if err == nil {
  194. // configServer := *ConfigServer
  195. // if !strings.HasPrefix(*ConfigServer, "http") {
  196. // configServer = fmt.Sprintf("http://%s", *ConfigServer)
  197. // }
  198. // confData.Section(ini.DEFAULT_SECTION).Key("ConfigDomain").SetValue(configServer + *ServerPrefix)
  199. // confData.Section(ini.DEFAULT_SECTION).Key("SendDomain").SetValue(*DataServer + *ServerPrefix)
  200. // err = confData.SaveTo(nativeConf)
  201. // if err != nil {
  202. // klog.Error(err)
  203. // }
  204. //}
  205. if *RunInContainer {
  206. if *HostDirPathPrefix == "" {
  207. *HostDirPathPrefix = "/host"
  208. }
  209. } else {
  210. *HostDirPathPrefix = ""
  211. }
  212. // 初始化端口白名单
  213. InitPortWhitelists()
  214. }
  215. func ShowVersion() {
  216. fmt.Printf("%-20s %-8s\n", "Name:", AgentName)
  217. fmt.Printf("%-20s %-8s\n", "Version:", AgentVersion)
  218. fmt.Printf("%-20s %-8s\n", "Commit:", GitCommit)
  219. fmt.Printf("%-20s %-8s\n", "Date:", BuildDate)
  220. os.Exit(0)
  221. }