flags.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package flags
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/coroot/coroot-node-agent/utils"
  6. "github.com/coroot/coroot-node-agent/utils/modelse"
  7. "github.com/jedib0t/go-pretty/v6/table"
  8. klog "github.com/sirupsen/logrus"
  9. "gopkg.in/alecthomas/kingpin.v2"
  10. "gopkg.in/ini.v1"
  11. "net/url"
  12. "os"
  13. "path"
  14. "runtime"
  15. "strings"
  16. )
  17. var (
  18. // apm
  19. ConfigServer = kingpin.Flag("config-server", "The URL of the endpoint to send traces to").Envar("CONFIG_SERVER").Default("http://10.0.16.250:18080").String()
  20. DataServer = kingpin.Flag("data-server", "The URL of the endpoint to send traces to").Envar("DATA_SERVER").Default("http://10.0.16.250:18080").String()
  21. DumpApps = kingpin.Flag("dump", "Dump app snap").Default("false").Bool()
  22. Version = kingpin.Flag("version", "show app version").Short('v').Bool()
  23. LogLevel = kingpin.Flag("log-level", "Log level").Envar("LOG_LEVEL").Default("info").String()
  24. EbpfFilePath = kingpin.Flag("ebpf-path", "Set ebpf file path").Envar("EBPF_FILE").Default("").String()
  25. CommonIni = kingpin.Flag("common.ini", "Set ebpf file path").Envar("COMMON_INI").Default("/opt/cloudwise/omniagent/conf/common.ini").String()
  26. ServerPrefix = kingpin.Flag("server-prefix", "server-prefix").Envar("SERVER_PREFIX").Default("").String()
  27. DisableRegisterHost = kingpin.Flag("disable-reg-host", "Disable reg host").Default("true").Envar("DISABLE_REG_HOST").Bool()
  28. // agent
  29. DisableE2ETracing = kingpin.Flag("disable-e2e-tracing", "Disable e2e tracing").Default("true").Envar("DISABLE_E2E_TRACING").Bool()
  30. DisableStackTracing = kingpin.Flag("disable-stack-tracing", "Disable stack tracing").Default("true").Envar("DISABLE_STACK_TRACING").Bool()
  31. LicenseKey = kingpin.Flag("license-key", "Apm API key").Default("J45Engw88NeHUZ4Q7qNsK8L47FTH**QvgW113IEnsNaBNMR5zZ**oj/g!!!!").Envar("LICENSE_KEY").String()
  32. RunInContainer = kingpin.Flag("run-in-container", "run in container").Default("false").Envar("RUN_IN_CONTAINER").Bool()
  33. RunInOmniagent = kingpin.Flag("run-in-omniagent", "run in omniagent").Default("false").Envar("RUN_IN_OMNIAGENT").Bool()
  34. ListenAddress = kingpin.Flag("listen", "Listen address - ip:port or :port").Default("0.0.0.0:8123").Envar("LISTEN").String()
  35. CgroupRoot = kingpin.Flag("cgroupfs-root", "The mount point of the host cgroupfs root").Default("/sys/fs/cgroup").Envar("CGROUPFS_ROOT").String()
  36. DisableLogParsing = kingpin.Flag("disable-log-parsing", "Disable container log parsing").Default("false").Envar("DISABLE_LOG_PARSING").Bool()
  37. DisablePinger = kingpin.Flag("disable-pinger", "Don't ping upstreams").Default("false").Envar("DISABLE_PINGER").Bool()
  38. DisableL7Tracing = kingpin.Flag("disable-l7-tracing", "Disable L7 tracing").Default("false").Envar("DISABLE_L7_TRACING").Bool()
  39. ExternalNetworksWhitelist = kingpin.
  40. 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)").
  41. Envar("TRACK_PUBLIC_NETWORK").
  42. Default("0.0.0.0/0").
  43. Strings()
  44. EphemeralPortRange = kingpin.Flag("ephemeral-port-range", "Destination and Listen TCP ports from this range will be skipped").Default("").Envar("EPHEMERAL_PORT_RANGE").String()
  45. Provider = kingpin.Flag("provider", "`provider` label for `node_cloud_info` metric").Envar("PROVIDER").String()
  46. Region = kingpin.Flag("region", "`region` label for `node_cloud_info` metric").Envar("REGION").String()
  47. AvailabilityZone = kingpin.Flag("availability-zone", "`availability_zone` label for `node_cloud_info` metric").Envar("AVAILABILITY_ZONE").String()
  48. InstanceType = kingpin.Flag("instance-type", "`instance_type` label for `node_cloud_info` metric").Envar("INSTANCE_TYPE").String()
  49. InstanceLifeCycle = kingpin.Flag("instance-life-cycle", "`instance_life_cycle` label for `node_cloud_info` metric").Envar("INSTANCE_LIFE_CYCLE").String()
  50. LogPerSecond = kingpin.Flag("log-per-second", "The number of logs per second").Default("10.0").Envar("LOG_PER_SECOND").Float64()
  51. 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()
  52. CollectorEndpoint = kingpin.Flag("collector-endpoint", "A base endpoint URL for metrics, traces, logs, and profiles").Envar("COLLECTOR_ENDPOINT").URL()
  53. ApiKey = kingpin.Flag("api-key", "Coroot API key").Envar("API_KEY").String()
  54. MetricsEndpoint = kingpin.Flag("metrics-endpoint", "The URL of the endpoint to send metrics to").Envar("METRICS_ENDPOINT").URL()
  55. TracesEndpoint = kingpin.Flag("traces-endpoint", "The URL of the endpoint to send traces to").Envar("TRACES_ENDPOINT").URL()
  56. LogsEndpoint = kingpin.Flag("logs-endpoint", "The URL of the endpoint to send logs to").Envar("LOGS_ENDPOINT").URL()
  57. ProfilesEndpoint = kingpin.Flag("profiles-endpoint", "The URL of the endpoint to send profiles to").Envar("PROFILES_ENDPOINT").URL()
  58. InsecureSkipVerify = kingpin.Flag("insecure-skip-verify", "whether to skip verifying the certificate or not").Envar("INSECURE_SKIP_VERIFY").Default("false").Bool()
  59. ScrapeInterval = kingpin.Flag("scrape-interval", "How often to gather metrics from the agent").Default("15s").Envar("SCRAPE_INTERVAL").Duration()
  60. 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()
  61. 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()
  62. FuseTryMax = kingpin.Flag("fuse_try_max", "The maximum number of the fuse operation try").Default("3").Envar("FUSE_TRY_MAX").Int()
  63. )
  64. var AgentName = "euspace"
  65. var AgentVersion = "0.0.1"
  66. var GitCommit = ""
  67. var BuildDate = ""
  68. func GetString(fl *string) string {
  69. if fl == nil {
  70. return ""
  71. }
  72. return *fl
  73. }
  74. func init() {
  75. if strings.HasSuffix(os.Args[0], ".test") {
  76. return
  77. }
  78. kingpin.HelpFlag.Short('h').Hidden()
  79. kingpin.Parse()
  80. if *Version {
  81. ShowVersion()
  82. }
  83. if *DumpApps {
  84. DumpTableFeatures()
  85. }
  86. if *CollectorEndpoint != nil {
  87. u := *CollectorEndpoint
  88. if *MetricsEndpoint == nil {
  89. *MetricsEndpoint = u.JoinPath("/v1/metrics")
  90. }
  91. if *TracesEndpoint == nil {
  92. *TracesEndpoint = u.JoinPath("/v1/traces")
  93. }
  94. if *LogsEndpoint == nil {
  95. *LogsEndpoint = u.JoinPath("/v1/logs")
  96. }
  97. if *ProfilesEndpoint == nil {
  98. *ProfilesEndpoint = u.JoinPath("/v1/profiles")
  99. }
  100. }
  101. if *MetricsEndpoint != nil {
  102. *ListenAddress = "127.0.0.1:10300"
  103. }
  104. // set ServerPrefix
  105. // set ConfigServer
  106. // set DataServer
  107. if *CommonIni != "" {
  108. iniData, err := ini.Load(*CommonIni)
  109. if err == nil && iniData != nil {
  110. *ServerPrefix = "/apm"
  111. *ConfigServer = iniData.Section("common").Key("config_server").String()
  112. *DataServer = iniData.Section("common").Key("data_server").String()
  113. }
  114. }
  115. // set TracesEndpoint
  116. if *TracesEndpoint == nil && *DataServer != "" {
  117. if !strings.HasPrefix(*DataServer, "http") {
  118. *DataServer = fmt.Sprintf("http://%s", *DataServer)
  119. }
  120. dataServer, err := url.Parse(*DataServer)
  121. if err == nil && dataServer != nil {
  122. *TracesEndpoint = dataServer.JoinPath(*ServerPrefix + "/api/v2/data/receive")
  123. }
  124. }
  125. // set tiny-agent config
  126. nativeConf := utils.GetDefaultAgentsPath("NativeAgent", "conf", "agent.properties")
  127. confData, err := ini.Load(nativeConf)
  128. if err == nil {
  129. configServer := *ConfigServer
  130. if !strings.HasPrefix(*ConfigServer, "http") {
  131. configServer = fmt.Sprintf("http://%s", *ConfigServer)
  132. }
  133. confData.Section(ini.DEFAULT_SECTION).Key("ConfigDomain").SetValue(configServer + *ServerPrefix)
  134. confData.Section(ini.DEFAULT_SECTION).Key("SendDomain").SetValue(*DataServer + *ServerPrefix)
  135. err = confData.SaveTo(nativeConf)
  136. if err != nil {
  137. klog.Error(err)
  138. }
  139. }
  140. if *RunInContainer {
  141. if *HostDirPathPrefix == "" {
  142. *HostDirPathPrefix = "/host"
  143. }
  144. } else {
  145. *HostDirPathPrefix = ""
  146. }
  147. }
  148. func DumpTableFeatures() {
  149. dumpPath := path.Join(utils.GetDefaultRuntimePath(), "memdump")
  150. fileName := path.Join(dumpPath, "app.snap")
  151. content, err := os.ReadFile(fileName)
  152. if err != nil {
  153. fmt.Println(err.Error())
  154. }
  155. s := make(map[uint32]modelse.AppStatusInfo)
  156. err = json.Unmarshal(content, &s)
  157. if err != nil {
  158. fmt.Println(err.Error())
  159. }
  160. t := table.NewWriter()
  161. for pid, info := range s {
  162. service := fmt.Sprintf("%s", info.Sn)
  163. t.AppendRow(table.Row{
  164. //info.AgentID,
  165. //info.UpdateAt,
  166. pid,
  167. info.ProcName,
  168. info.AppName,
  169. info.Rule,
  170. info.Language,
  171. service,
  172. info.AppID,
  173. info.RegisterAt,
  174. info.PreStatus.String(),
  175. info.Status.String(),
  176. info.StackStatus,
  177. })
  178. }
  179. t.SetAutoIndex(true)
  180. t.AppendHeader(table.Row{
  181. //"agent id",
  182. //"update at",
  183. "pid",
  184. "process",
  185. "app name",
  186. "app rule",
  187. "code",
  188. "service",
  189. "app id",
  190. "reg at",
  191. "app pre status",
  192. "app status",
  193. "stack status",
  194. })
  195. fmt.Println(t.Render())
  196. os.Exit(0)
  197. }
  198. func ShowVersion() {
  199. fmt.Printf("%-20s %-8s\n", "Name:", AgentName)
  200. fmt.Printf("%-20s %-8s\n", "Version:", AgentVersion)
  201. fmt.Printf("%-20s %-8s\n", "Commit:", GitCommit)
  202. fmt.Printf("%-20s %-8s\n", "Date:", BuildDate)
  203. fmt.Printf("%-20s %-8s\n", "go version:", runtime.Version())
  204. os.Exit(0)
  205. }