func init() { flag.StringVar(&conf, "conf", "config.toml", "Path of the configuration file") flag.BoolVar(&version, "version", false, "Return version") flag.StringVar(&user, "user", "", "User for MariaDB login, specified in the [user]:[password] format") flag.StringVar(&hosts, "hosts", "", "List of MariaDB hosts IP and port (optional), specified in the host:[port] format and separated by commas") flag.StringVar(&socket, "socket", "/var/run/mysqld/mysqld.sock", "Path of MariaDB unix socket") flag.StringVar(&rpluser, "rpluser", "", "Replication user in the [user]:[password] format") flag.BoolVar(&interactive, "interactive", true, "Ask for user interaction when failures are detected") flag.BoolVar(&verbose, "verbose", false, "Print detailed execution info") flag.StringVar(&preScript, "pre-failover-script", "", "Path of pre-failover script") flag.StringVar(&postScript, "post-failover-script", "", "Path of post-failover script") flag.Int64Var(&maxDelay, "maxdelay", 0, "Maximum replication delay before initiating failover") flag.BoolVar(>idCheck, "gtidcheck", false, "Check that GTID sequence numbers are identical before initiating failover") flag.StringVar(&prefMaster, "prefmaster", "", "Preferred candidate server for master failover, in host:[port] format") flag.StringVar(&ignoreSrv, "ignore-servers", "", "List of servers to ignore in slave promotion operations") flag.Int64Var(&waitKill, "wait-kill", 5000, "Wait this many milliseconds before killing threads on demoted master") flag.BoolVar(&readonly, "readonly", true, "Set slaves as read-only after switchover") flag.StringVar(&failover, "failover", "", "Failover mode, either 'monitor', 'force' or 'check'") flag.IntVar(&maxfail, "failcount", 5, "Trigger failover after N failures (interval 1s)") flag.StringVar(&switchover, "switchover", "", "Switchover mode, either 'keep' or 'kill' the old master.") flag.BoolVar(&autorejoin, "autorejoin", true, "Automatically rejoin a failed server to the current master.") flag.StringVar(&logfile, "logfile", "", "Write MRM messages to a log file") flag.IntVar(&timeout, "connect-timeout", 5, "Database connection timeout in seconds") flag.IntVar(&faillimit, "failover-limit", 0, "In auto-monitor mode, quit after N failovers (0: unlimited)") flag.Int64Var(&failtime, "failover-time-limit", 0, "In auto-monitor mode, wait N seconds before attempting next failover (0: do not wait)") }
func readConfig(parse bool) { var err error // Set defaults ConfigYAML.UDPServiceAddress = defaultUDPServiceAddress ConfigYAML.TCPServiceAddress = defaultTCPServiceAddress ConfigYAML.MaxUDPPacketSize = maxUDPPacket ConfigYAML.BackendType = defaultBackendType ConfigYAML.PostFlushCmd = "stdout" ConfigYAML.GraphiteAddress = defaultGraphiteAddress ConfigYAML.OpenTSDBAddress = defaultOpenTSDBAddress ConfigYAML.FlushInterval = flushInterval ConfigYAML.LogLevel = "error" ConfigYAML.ShowVersion = false ConfigYAML.DeleteGauges = true ConfigYAML.ResetCounters = true ConfigYAML.PersistCountKeys = 0 ConfigYAML.StatsPrefix = statsPrefixName ConfigYAML.StoreDb = dbPath ConfigYAML.Prefix = "" ConfigYAML.ExtraTags = "" ConfigYAML.PercentThreshold = Percentiles{} // Percentiles{{Float: 50.0, Str: "50"}, {Float: 80.0, Str: "80"}, {Float: 90.0, Str: "90"}, {Float: 95.0, Str: "95"}} ConfigYAML.PrintConfig = false ConfigYAML.LogName = "stdout" ConfigYAML.LogToSyslog = true ConfigYAML.SyslogUDPAddress = "localhost:514" Config = ConfigYAML os.Setenv("CONFIGOR_ENV_PREFIX", "SD") configFile = flag.String("config", "", "Configuration file name (warning not error if not exists). Standard: "+configPath) flag.StringVar(&Config.UDPServiceAddress, "udp-addr", ConfigYAML.UDPServiceAddress, "UDP listen service address") flag.StringVar(&Config.TCPServiceAddress, "tcp-addr", ConfigYAML.TCPServiceAddress, "TCP listen service address, if set") flag.Int64Var(&Config.MaxUDPPacketSize, "max-udp-packet-size", ConfigYAML.MaxUDPPacketSize, "Maximum UDP packet size") flag.StringVar(&Config.BackendType, "backend-type", ConfigYAML.BackendType, "MANDATORY: Backend to use: graphite, opentsdb, external, dummy") flag.StringVar(&Config.PostFlushCmd, "post-flush-cmd", ConfigYAML.PostFlushCmd, "Command to run on each flush") flag.StringVar(&Config.GraphiteAddress, "graphite", ConfigYAML.GraphiteAddress, "Graphite service address") flag.StringVar(&Config.OpenTSDBAddress, "opentsdb", ConfigYAML.OpenTSDBAddress, "OpenTSDB service address") flag.Int64Var(&Config.FlushInterval, "flush-interval", ConfigYAML.FlushInterval, "Flush interval (seconds)") flag.StringVar(&Config.LogLevel, "log-level", ConfigYAML.LogLevel, "Set log level (debug,info,warn,error,fatal)") flag.BoolVar(&Config.ShowVersion, "version", ConfigYAML.ShowVersion, "Print version string") flag.BoolVar(&Config.DeleteGauges, "delete-gauges", ConfigYAML.DeleteGauges, "Don't send values to graphite for inactive gauges, as opposed to sending the previous value") flag.BoolVar(&Config.ResetCounters, "reset-counters", ConfigYAML.ResetCounters, "Reset counters after sending value to backend (send rate) or send cumulated value (artificial counter - eg. for OpenTSDB & Grafana)") flag.Int64Var(&Config.PersistCountKeys, "persist-count-keys", ConfigYAML.PersistCountKeys, "Number of flush-intervals to persist count keys") flag.StringVar(&Config.StatsPrefix, "stats-prefix", ConfigYAML.StatsPrefix, "Name for internal application metrics (no prefix prepended)") flag.StringVar(&Config.StoreDb, "store-db", ConfigYAML.StoreDb, "Name of database for permanent counters storage (for conversion from rate to counter)") flag.StringVar(&Config.Prefix, "prefix", ConfigYAML.Prefix, "Prefix for all stats") flag.StringVar(&Config.ExtraTags, "extra-tags", ConfigYAML.ExtraTags, "Default tags added to all measures in format: tag1=value1 tag2=value2") flag.Var(&Config.PercentThreshold, "percent-threshold", "Percentile calculation for timers (0-100, may be given multiple times)") flag.BoolVar(&Config.PrintConfig, "print-config", ConfigYAML.PrintConfig, "Print config in YAML format") flag.StringVar(&Config.LogName, "log-name", ConfigYAML.LogName, "Name of file to log into. If \"stdout\" than logs to stdout.If empty logs go to /dev/null") flag.BoolVar(&Config.LogToSyslog, "log-to-syslopg", ConfigYAML.LogToSyslog, "Log to syslog") flag.StringVar(&Config.SyslogUDPAddress, "syslog-udp-address", ConfigYAML.SyslogUDPAddress, "Syslog address with port number eg. localhost:514. If empty log to unix socket") if parse { flag.Parse() } if len(*configFile) > 0 { if _, err = os.Stat(*configFile); os.IsNotExist(err) { fmt.Printf("# Warning: No config file: %s\n", *configFile) *configFile = "" } if len(*configFile) > 0 { err = configor.Load(&ConfigYAML, *configFile) if err != nil { fmt.Printf("Error loading config file: %s\n", err) } else { // set configs read form YAML file // save 2 flags tmpConfig := Config // Overwites flags Config = ConfigYAML // restore 2 flags Config.ShowVersion = tmpConfig.ShowVersion Config.PrintConfig = tmpConfig.PrintConfig } } // visitor := func(a *flag.Flag) { // fmt.Println(">", a.Name, "value=", a.Value) // switch a.Name { // case "print-config", "version": // break // case "udp-addr": // ConfigYAML.UDPServiceAddress = a.Value.(string) // default: // fmt.Printf("Internal Config Error - unknown variable: %s\n", a.Name) // os.Exit(1) // } // // } // flag.Visit(visitor) } // Normalize prefix Config.Prefix = normalizeDot(Config.Prefix, true) // Normalize internal metrics name Config.StatsPrefix = normalizeDot(Config.StatsPrefix, true) // calculate extraFlags hash Config.ExtraTagsHash, err = parseExtraTags(Config.ExtraTags) if err != nil { fmt.Printf("Extra Tags: \"%s\" - %s\n", Config.ExtraTags, err) os.Exit(1) } // Set InternalLogLevel Config.InternalLogLevel, err = log.ParseLevel(Config.LogLevel) if err != nil { fmt.Printf("Invalid log level: \"%s\"\n", Config.LogLevel) os.Exit(1) } }