1
0
mirror of https://github.com/go-micro/go-micro.git synced 2025-04-23 11:07:43 +02:00
2020-12-26 15:17:20 +00:00

133 lines
3.2 KiB
Go

package main
import (
"context"
"os"
"os/signal"
"time"
"github.com/micro/cli/v2"
"github.com/micro/go-micro/v2/client"
gcli "github.com/micro/go-micro/v2/client/grpc"
"github.com/micro/go-micro/v2/config/cmd"
proto "github.com/micro/go-micro/v2/debug/service/proto"
"github.com/micro/go-micro/v2/util/log"
_ "github.com/micro/go-plugins/registry/kubernetes/v2"
)
const (
// StatusInvalidArguments indicates specified invalid arguments.
StatusInvalidArguments = 1
// StatusConnectionFailure indicates connection failed.
StatusConnectionFailure = 2
// StatusUnhealthy indicates rpc succeeded but indicates unhealthy service.
StatusUnhealthy = 4
)
var (
serverAddress string
serverName string
connTimeout time.Duration
rpcTimeout time.Duration
verbose bool
)
func init() {
os.Setenv("MICRO_REGISTRY", "kubernetes")
client.DefaultClient = gcli.NewClient()
argError := func(s string, v ...interface{}) {
log.Logf("error: "+s, v...)
os.Exit(StatusInvalidArguments)
}
app := cmd.App()
app.Flags = append(app.Flags,
&cli.DurationFlag{
Name: "connect_timeout",
Value: time.Second,
Usage: "timeout for establishing connection",
EnvVars: []string{"MICRO_CONNECT_TIMEOUT"},
Destination: &connTimeout,
},
&cli.DurationFlag{
Name: "rpc_timeout",
Value: time.Second,
Usage: "timeout for health check rpc",
EnvVars: []string{"MICRO_RPC_TIMEOUT"},
Destination: &rpcTimeout,
},
&cli.BoolFlag{
Name: "verbose",
Usage: "verbose logs",
EnvVars: []string{"MICRO_VERBOSE"},
Destination: &verbose,
},
)
app.Action = func(c *cli.Context) error {
serverName = c.String("server_name")
serverAddress = c.String("server_address")
if len(serverName) == 0 {
argError("server name not set")
}
if len(serverAddress) == 0 {
argError("server address not set")
}
if connTimeout <= 0 {
argError("connection timeout must be greater than zero (specified: %v)", connTimeout)
}
if rpcTimeout <= 0 {
argError("rpc timeout must be greater than zero (specified: %v)", rpcTimeout)
}
return nil
}
cmd.Init()
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func() {
sig := <-c
if sig == os.Interrupt {
log.Log("cancellation received")
cancel()
return
}
}()
if !verbose {
log.Log("establishing connection")
}
req := client.NewRequest(serverName, "Debug.Health", &proto.HealthRequest{})
rsp := &proto.HealthResponse{}
startTime := time.Now()
err := client.Call(ctx, req, rsp, client.WithAddress(serverAddress), client.WithDialTimeout(connTimeout), client.WithRequestTimeout(connTimeout))
if err != nil {
if err == context.DeadlineExceeded {
log.Logf("timeout: failed to connect service %q within %v", serverAddress, connTimeout)
} else {
log.Logf("error: failed to connect service at %q: %+v", serverAddress, err)
}
os.Exit(StatusConnectionFailure)
}
if !verbose {
log.Logf("time elapsed: %v", time.Since(startTime))
}
if rsp.Status != "ok" {
log.Logf("service unhealthy (responded with %q)", rsp.Status)
os.Exit(StatusUnhealthy)
}
log.Logf("status: %v", rsp.Status)
}