flags.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. "strings"
  15. )
  16. var (
  17. // apm
  18. 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()
  19. 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()
  20. DumpApps = kingpin.Flag("dump", "Dump app snap").Default("false").Bool()
  21. LogLevel = kingpin.Flag("log-level", "Log level").Envar("LOG_LEVEL").Default("info").String()
  22. EbpfFilePath = kingpin.Flag("ebpf-path", "Set ebpf file path").Envar("EBPF_FILE").Default("").String()
  23. CommonIni = kingpin.Flag("common.ini", "Set ebpf file path").Envar("COMMON_INI").Default("/opt/cloudwise/omniagent/conf/common.ini").String()
  24. ServerPrefix = kingpin.Flag("server-prefix", "server-prefix").Envar("SERVER_PREFIX").Default("").String()
  25. DisableRegisterHost = kingpin.Flag("disable-reg-host", "Disable reg host").Default("true").Envar("DISABLE_REG_HOST").Bool()
  26. // agent
  27. DisableE2ETracing = kingpin.Flag("disable-e2e-tracing", "Disable e2e tracing").Default("true").Envar("DISABLE_E2E_TRACING").Bool()
  28. DisableStackTracing = kingpin.Flag("disable-stack-tracing", "Disable stack tracing").Default("true").Envar("DISABLE_STACK_TRACING").Bool()
  29. LicenseKey = kingpin.Flag("license-key", "Apm API key").Default("J45Engw88NeHUZ4Q7qNsK8L47FTH**QvgW113IEnsNaBNMR5zZ**oj/g!!!!").Envar("LICENSE_KEY").String()
  30. RunInContainer = kingpin.Flag("run-in-container", "run in container").Default("false").Envar("RUN_IN_CONTAINER").Bool()
  31. RunInOmniagent = kingpin.Flag("run-in-omniagent", "run in omniagent").Default("false").Envar("RUN_IN_OMNIAGENT").Bool()
  32. ListenAddress = kingpin.Flag("listen", "Listen address - ip:port or :port").Default("0.0.0.0:8123").Envar("LISTEN").String()
  33. CgroupRoot = kingpin.Flag("cgroupfs-root", "The mount point of the host cgroupfs root").Default("/sys/fs/cgroup").Envar("CGROUPFS_ROOT").String()
  34. DisableLogParsing = kingpin.Flag("disable-log-parsing", "Disable container log parsing").Default("false").Envar("DISABLE_LOG_PARSING").Bool()
  35. DisablePinger = kingpin.Flag("disable-pinger", "Don't ping upstreams").Default("false").Envar("DISABLE_PINGER").Bool()
  36. DisableL7Tracing = kingpin.Flag("disable-l7-tracing", "Disable L7 tracing").Default("false").Envar("DISABLE_L7_TRACING").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. ScrapeInterval = kingpin.Flag("scrape-interval", "How often to gather metrics from the agent").Default("15s").Envar("SCRAPE_INTERVAL").Duration()
  58. 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()
  59. 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()
  60. )
  61. func GetString(fl *string) string {
  62. if fl == nil {
  63. return ""
  64. }
  65. return *fl
  66. }
  67. func init() {
  68. if strings.HasSuffix(os.Args[0], ".test") {
  69. return
  70. }
  71. kingpin.HelpFlag.Short('h').Hidden()
  72. kingpin.Parse()
  73. if *DumpApps {
  74. DumpTableFeatures()
  75. }
  76. if *CollectorEndpoint != nil {
  77. u := *CollectorEndpoint
  78. if *MetricsEndpoint == nil {
  79. *MetricsEndpoint = u.JoinPath("/v1/metrics")
  80. }
  81. if *TracesEndpoint == nil {
  82. *TracesEndpoint = u.JoinPath("/v1/traces")
  83. }
  84. if *LogsEndpoint == nil {
  85. *LogsEndpoint = u.JoinPath("/v1/logs")
  86. }
  87. if *ProfilesEndpoint == nil {
  88. *ProfilesEndpoint = u.JoinPath("/v1/profiles")
  89. }
  90. }
  91. if *MetricsEndpoint != nil {
  92. *ListenAddress = "127.0.0.1:10300"
  93. }
  94. // set ServerPrefix
  95. // set ConfigServer
  96. // set DataServer
  97. if *CommonIni != "" {
  98. iniData, err := ini.Load(*CommonIni)
  99. if err == nil && iniData != nil {
  100. *ServerPrefix = "/apm"
  101. *ConfigServer = iniData.Section("common").Key("config_server").String()
  102. *DataServer = iniData.Section("common").Key("data_server").String()
  103. }
  104. }
  105. // set TracesEndpoint
  106. if *TracesEndpoint == nil && *DataServer != "" {
  107. if !strings.HasPrefix(*DataServer, "http") {
  108. *DataServer = fmt.Sprintf("http://%s", *DataServer)
  109. }
  110. dataServer, err := url.Parse(*DataServer)
  111. if err == nil && dataServer != nil {
  112. *TracesEndpoint = dataServer.JoinPath(*ServerPrefix + "/api/v2/data/receive")
  113. }
  114. }
  115. // set tiny-agent config
  116. nativeConf := utils.GetDefaultAgentsPath("NativeAgent", "conf", "agent.properties")
  117. confData, err := ini.Load(nativeConf)
  118. if err == nil {
  119. var configServer string
  120. if !strings.HasPrefix(*ConfigServer, "http") {
  121. configServer = fmt.Sprintf("http://%s", *ConfigServer)
  122. }
  123. confData.Section(ini.DEFAULT_SECTION).Key("ConfigDomain").SetValue(configServer + *ServerPrefix)
  124. confData.Section(ini.DEFAULT_SECTION).Key("SendDomain").SetValue(*DataServer + *ServerPrefix)
  125. err = confData.SaveTo(nativeConf)
  126. if err != nil {
  127. klog.Error(err)
  128. }
  129. }
  130. if *RunInContainer {
  131. if *HostDirPathPrefix == "" {
  132. *HostDirPathPrefix = "/host"
  133. }
  134. } else {
  135. *HostDirPathPrefix = ""
  136. }
  137. }
  138. func DumpTableFeatures() {
  139. dumpPath := path.Join(utils.GetDefaultRuntimePath(), "memdump")
  140. fileName := path.Join(dumpPath, "app.snap")
  141. content, err := os.ReadFile(fileName)
  142. if err != nil {
  143. fmt.Println(err.Error())
  144. }
  145. s := make(map[uint32]modelse.AppStatusInfo)
  146. err = json.Unmarshal(content, &s)
  147. if err != nil {
  148. fmt.Println(err.Error())
  149. }
  150. t := table.NewWriter()
  151. for pid, info := range s {
  152. service := fmt.Sprintf("%s:%d", info.Sn, info.Sport)
  153. t.AppendRow(table.Row{
  154. pid,
  155. info.ProcName,
  156. info.AppName,
  157. info.Rule,
  158. info.Language,
  159. service,
  160. info.AppID,
  161. //info.AgentID,
  162. info.RegisterAt,
  163. info.UpdateAt,
  164. info.Status.String(),
  165. })
  166. }
  167. t.SetAutoIndex(true)
  168. t.AppendHeader(table.Row{
  169. "pid",
  170. "process",
  171. "app name",
  172. "app rule",
  173. "code",
  174. "service",
  175. "app id",
  176. //"agent id",
  177. "first register at",
  178. "update at",
  179. "app status",
  180. })
  181. fmt.Println(t.Render())
  182. os.Exit(0)
  183. }