add nagios mode
Gitea/etcdmtr/pipeline/head This commit looks good Details

This commit is contained in:
dave 2024-03-07 22:34:51 -07:00
parent 15b1dffa32
commit 2e262a63a8
1 changed files with 35 additions and 10 deletions

View File

@ -25,6 +25,7 @@ type EtcdMtrArgs struct {
Timeout int `short:"t" long:"timeout" description:"Operation timeout in seconds"`
ExpectedMembers int `short:"m" long:"members" description:"Expect at least this many members"`
Debug bool `long:"debug" description:"Show debug output and etcd messages"`
Nagios bool `long:"nagios" description:"Output nagios/nrpe format"`
}
type Client struct {
@ -107,17 +108,33 @@ func main() {
logger := etcdmtr.NewRootLogger()
if args.Nagios {
fatalHandler := func(logger *etcdmtr.ELog, exitCode int, message string, a ...any) {
code2name := []string{"OK", "WARNING", "CRITICAL", "UNKNOWN"}
msg := fmt.Sprintf(message, a...)
fmt.Printf("%s - %s\n", code2name[exitCode], msg)
os.Exit(exitCode)
}
logger.FatalHandler = fatalHandler
logger.Level = etcdmtr.LOGLEVEL_SILENCE
if args.ExpectedMembers < 1 {
logger.Fatalc(3, "--nagios requires --members > 0")
}
}
if args.Version {
logger.Fatalc(1, "0.0.1")
logger.Fatalc(0, "0.0.1")
}
if len(positionals) < 1 {
logger.Fatal("must specify endpoints")
logger.Fatalc(3, "must specify endpoints")
}
if !args.Insecure {
if args.ClientKey == "" || args.ClientCert == "" || args.ServerCA == "" {
logger.Fatal("must set --insecure if not passing --client-cert, --client-key, and --ca")
logger.Fatalc(3, "must set --insecure if not passing --client-cert, --client-key, and --ca")
}
}
@ -127,7 +144,7 @@ func main() {
client, err := NewClient(positionals, args.ClientCert, args.ClientKey, args.ServerCA, args.Debug)
if err != nil {
logger.Fatal("couldn't get client: %s", err.Error())
logger.Fatalc(3, "couldn't get client: %s", err.Error())
}
etcd, err := client.GetEtcd()
@ -160,23 +177,31 @@ func main() {
is_leader, err := contactMember(contextCtx, client, endpoint)
if err != nil {
logger.Warning("couldn't reach member %s: %s", endpoint, err)
logger.Error("couldn't reach member %s: %s", endpoint, err)
memberErrors = append(memberErrors, err)
continue
}
logger.Info("reached member %s - is leader? %v", endpoint, is_leader)
}
if args.Nagios {
if numMembers != args.ExpectedMembers {
}
}
if args.ExpectedMembers > 0 {
if numMembers != args.ExpectedMembers {
logger.Error("found different number of members than expected: %d", numMembers)
os.Exit(1)
logger.Fatalc(2, "found %d members, expected %d", numMembers, args.ExpectedMembers)
}
if len(memberErrors) > 0 {
logger.Error("encountered an error when contacting %d members", len(memberErrors))
os.Exit(1)
logger.Fatalc(2, "couldn't contact %d members", len(memberErrors))
}
}
if args.Nagios {
logger.Fatalc(0, "found %d members", numMembers)
}
}
func contactMember(ctx context.Context, client *Client, endpoint string) (bool, error) {
@ -188,7 +213,7 @@ func contactMember(ctx context.Context, client *Client, endpoint string) (bool,
status, err := etcd.Status(ctx, endpoint)
if err != nil {
return false, fmt.Errorf("couldn't reach member: %s", err)
return false, err
}
return status.Leader == status.Header.MemberId, nil
}