etcdmain: support structured logging for discovery service

Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
This commit is contained in:
Gyuho Lee 2018-04-26 14:22:58 -07:00
parent c316e6773b
commit 829c4479f3
4 changed files with 102 additions and 29 deletions

View File

@ -63,14 +63,14 @@ func startEtcdOrProxyV2() {
if err != nil { if err != nil {
lg := cfg.ec.GetLogger() lg := cfg.ec.GetLogger()
if lg != nil { if lg != nil {
lg.Error("failed to verify flags", zap.Error(err)) lg.Warn("failed to verify flags", zap.Error(err))
} else { } else {
plog.Errorf("error verifying flags, %v. See 'etcd --help'.", err) plog.Errorf("error verifying flags, %v. See 'etcd --help'.", err)
} }
switch err { switch err {
case embed.ErrUnsetAdvertiseClientURLsFlag: case embed.ErrUnsetAdvertiseClientURLsFlag:
if lg != nil { if lg != nil {
lg.Error("advertise client URLs are not set", zap.Error(err)) lg.Warn("advertise client URLs are not set", zap.Error(err))
} else { } else {
plog.Errorf("When listening on specific address(es), this etcd process must advertise accessible url(s) to each connected client.") plog.Errorf("When listening on specific address(es), this etcd process must advertise accessible url(s) to each connected client.")
} }
@ -143,7 +143,11 @@ func startEtcdOrProxyV2() {
which := identifyDataDirOrDie(cfg.ec.GetLogger(), cfg.ec.Dir) which := identifyDataDirOrDie(cfg.ec.GetLogger(), cfg.ec.Dir)
if which != dirEmpty { if which != dirEmpty {
if lg != nil { if lg != nil {
lg.Info(
"server has been already initialized",
zap.String("data-dir", cfg.ec.Dir),
zap.String("dir-type", string(which)),
)
} else { } else {
plog.Noticef("the server is already initialized as %v before, starting as etcd %v...", which, which) plog.Noticef("the server is already initialized as %v before, starting as etcd %v...", which, which)
} }
@ -153,7 +157,14 @@ func startEtcdOrProxyV2() {
case dirProxy: case dirProxy:
err = startProxy(cfg) err = startProxy(cfg)
default: default:
plog.Panicf("unhandled dir type %v", which) if lg != nil {
lg.Panic(
"unknown directory type",
zap.String("dir-type", string(which)),
)
} else {
plog.Panicf("unhandled dir type %v", which)
}
} }
} else { } else {
shouldProxy := cfg.isProxy() shouldProxy := cfg.isProxy()
@ -162,12 +173,20 @@ func startEtcdOrProxyV2() {
if derr, ok := err.(*etcdserver.DiscoveryError); ok && derr.Err == discovery.ErrFullCluster { if derr, ok := err.(*etcdserver.DiscoveryError); ok && derr.Err == discovery.ErrFullCluster {
if cfg.shouldFallbackToProxy() { if cfg.shouldFallbackToProxy() {
if lg != nil { if lg != nil {
lg.Warn(
"discovery cluster is full, falling back to proxy",
zap.String("fallback-proxy", fallbackFlagProxy),
zap.Error(err),
)
} else { } else {
plog.Noticef("discovery cluster full, falling back to %s", fallbackFlagProxy) plog.Noticef("discovery cluster full, falling back to %s", fallbackFlagProxy)
} }
shouldProxy = true shouldProxy = true
} }
} else if err != nil {
if lg != nil {
lg.Warn("failed to start etcd", zap.Error(err))
}
} }
} }
if shouldProxy { if shouldProxy {
@ -180,13 +199,13 @@ func startEtcdOrProxyV2() {
switch derr.Err { switch derr.Err {
case discovery.ErrDuplicateID: case discovery.ErrDuplicateID:
if lg != nil { if lg != nil {
lg.Error( lg.Warn(
"member has been registered with discovery service", "member has been registered with discovery service",
zap.String("name", cfg.ec.Name), zap.String("name", cfg.ec.Name),
zap.String("discovery-token", cfg.ec.Durl), zap.String("discovery-token", cfg.ec.Durl),
zap.Error(derr.Err), zap.Error(derr.Err),
) )
lg.Error( lg.Warn(
"but could not find valid cluster configuration", "but could not find valid cluster configuration",
zap.String("data-dir", cfg.ec.Dir), zap.String("data-dir", cfg.ec.Dir),
) )
@ -198,9 +217,10 @@ func startEtcdOrProxyV2() {
plog.Infof("Please check the given data dir path if the previous bootstrap succeeded") plog.Infof("Please check the given data dir path if the previous bootstrap succeeded")
plog.Infof("or use a new discovery token if the previous bootstrap failed.") plog.Infof("or use a new discovery token if the previous bootstrap failed.")
} }
case discovery.ErrDuplicateName: case discovery.ErrDuplicateName:
if lg != nil { if lg != nil {
lg.Error( lg.Warn(
"member with duplicated name has already been registered", "member with duplicated name has already been registered",
zap.String("discovery-token", cfg.ec.Durl), zap.String("discovery-token", cfg.ec.Durl),
zap.Error(derr.Err), zap.Error(derr.Err),
@ -212,9 +232,10 @@ func startEtcdOrProxyV2() {
plog.Errorf("please check (cURL) the discovery token for more information.") plog.Errorf("please check (cURL) the discovery token for more information.")
plog.Errorf("please do not reuse the discovery token and generate a new one to bootstrap the cluster.") plog.Errorf("please do not reuse the discovery token and generate a new one to bootstrap the cluster.")
} }
default: default:
if lg != nil { if lg != nil {
lg.Error( lg.Warn(
"failed to bootstrap; discovery token was already used", "failed to bootstrap; discovery token was already used",
zap.String("discovery-token", cfg.ec.Durl), zap.String("discovery-token", cfg.ec.Durl),
zap.Error(err), zap.Error(err),
@ -231,7 +252,7 @@ func startEtcdOrProxyV2() {
if strings.Contains(err.Error(), "include") && strings.Contains(err.Error(), "--initial-cluster") { if strings.Contains(err.Error(), "include") && strings.Contains(err.Error(), "--initial-cluster") {
if lg != nil { if lg != nil {
lg.Error("failed to start", zap.Error(err)) lg.Warn("failed to start", zap.Error(err))
} else { } else {
plog.Infof("%v", err) plog.Infof("%v", err)
} }
@ -320,7 +341,12 @@ func startProxy(cfg *config) error {
clientTLSInfo.InsecureSkipVerify = cfg.ec.ClientAutoTLS clientTLSInfo.InsecureSkipVerify = cfg.ec.ClientAutoTLS
cfg.ec.PeerTLSInfo.InsecureSkipVerify = cfg.ec.PeerAutoTLS cfg.ec.PeerTLSInfo.InsecureSkipVerify = cfg.ec.PeerAutoTLS
pt, err := transport.NewTimeoutTransport(clientTLSInfo, time.Duration(cfg.cp.ProxyDialTimeoutMs)*time.Millisecond, time.Duration(cfg.cp.ProxyReadTimeoutMs)*time.Millisecond, time.Duration(cfg.cp.ProxyWriteTimeoutMs)*time.Millisecond) pt, err := transport.NewTimeoutTransport(
clientTLSInfo,
time.Duration(cfg.cp.ProxyDialTimeoutMs)*time.Millisecond,
time.Duration(cfg.cp.ProxyReadTimeoutMs)*time.Millisecond,
time.Duration(cfg.cp.ProxyWriteTimeoutMs)*time.Millisecond,
)
if err != nil { if err != nil {
return err return err
} }
@ -333,7 +359,12 @@ func startProxy(cfg *config) error {
plog.Fatalf("could not get certs (%v)", err) plog.Fatalf("could not get certs (%v)", err)
} }
} }
tr, err := transport.NewTimeoutTransport(cfg.ec.PeerTLSInfo, time.Duration(cfg.cp.ProxyDialTimeoutMs)*time.Millisecond, time.Duration(cfg.cp.ProxyReadTimeoutMs)*time.Millisecond, time.Duration(cfg.cp.ProxyWriteTimeoutMs)*time.Millisecond) tr, err := transport.NewTimeoutTransport(
cfg.ec.PeerTLSInfo,
time.Duration(cfg.cp.ProxyDialTimeoutMs)*time.Millisecond,
time.Duration(cfg.cp.ProxyReadTimeoutMs)*time.Millisecond,
time.Duration(cfg.cp.ProxyWriteTimeoutMs)*time.Millisecond,
)
if err != nil { if err != nil {
return err return err
} }
@ -385,6 +416,7 @@ func startProxy(cfg *config) error {
} else { } else {
plog.Infof("proxy: using peer urls %v from cluster file %q", peerURLs, clusterfile) plog.Infof("proxy: using peer urls %v from cluster file %q", peerURLs, clusterfile)
} }
case os.IsNotExist(err): case os.IsNotExist(err):
var urlsmap types.URLsMap var urlsmap types.URLsMap
urlsmap, _, err = cfg.ec.PeerURLsMapAndToken("proxy") urlsmap, _, err = cfg.ec.PeerURLsMapAndToken("proxy")
@ -394,7 +426,7 @@ func startProxy(cfg *config) error {
if cfg.ec.Durl != "" { if cfg.ec.Durl != "" {
var s string var s string
s, err = discovery.GetCluster(cfg.ec.Durl, cfg.ec.Dproxy) s, err = discovery.GetCluster(lg, cfg.ec.Durl, cfg.ec.Dproxy)
if err != nil { if err != nil {
return err return err
} }
@ -408,6 +440,7 @@ func startProxy(cfg *config) error {
} else { } else {
plog.Infof("proxy: using peer urls %v ", peerURLs) plog.Infof("proxy: using peer urls %v ", peerURLs)
} }
default: default:
return err return err
} }

View File

@ -21,11 +21,10 @@ import (
"os" "os"
"time" "time"
"go.uber.org/zap"
"github.com/coreos/etcd/proxy/tcpproxy" "github.com/coreos/etcd/proxy/tcpproxy"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"go.uber.org/zap"
) )
var ( var (
@ -91,7 +90,14 @@ func stripSchema(eps []string) []string {
} }
func startGateway(cmd *cobra.Command, args []string) { func startGateway(cmd *cobra.Command, args []string) {
srvs := discoverEndpoints(gatewayDNSCluster, gatewayCA, gatewayInsecureDiscovery) var lg *zap.Logger
lg, err := zap.NewProduction()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
srvs := discoverEndpoints(lg, gatewayDNSCluster, gatewayCA, gatewayInsecureDiscovery)
if len(srvs.Endpoints) == 0 { if len(srvs.Endpoints) == 0 {
// no endpoints discovered, fall back to provided endpoints // no endpoints discovered, fall back to provided endpoints
srvs.Endpoints = gatewayEndpoints srvs.Endpoints = gatewayEndpoints
@ -116,13 +122,6 @@ func startGateway(cmd *cobra.Command, args []string) {
os.Exit(1) os.Exit(1)
} }
var lg *zap.Logger
lg, err := zap.NewProduction()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
var l net.Listener var l net.Listener
l, err = net.Listen("tcp", gatewayListenAddr) l, err = net.Listen("tcp", gatewayListenAddr)
if err != nil { if err != nil {

View File

@ -238,7 +238,7 @@ func checkArgs() {
} }
func mustNewClient(lg *zap.Logger) *clientv3.Client { func mustNewClient(lg *zap.Logger) *clientv3.Client {
srvs := discoverEndpoints(grpcProxyDNSCluster, grpcProxyCA, grpcProxyInsecureDiscovery) srvs := discoverEndpoints(lg, grpcProxyDNSCluster, grpcProxyCA, grpcProxyInsecureDiscovery)
eps := srvs.Endpoints eps := srvs.Endpoints
if len(eps) == 0 { if len(eps) == 0 {
eps = grpcProxyEndpoints eps = grpcProxyEndpoints

View File

@ -20,9 +20,11 @@ import (
"github.com/coreos/etcd/pkg/srv" "github.com/coreos/etcd/pkg/srv"
"github.com/coreos/etcd/pkg/transport" "github.com/coreos/etcd/pkg/transport"
"go.uber.org/zap"
) )
func discoverEndpoints(dns string, ca string, insecure bool) (s srv.SRVClients) { func discoverEndpoints(lg *zap.Logger, dns string, ca string, insecure bool) (s srv.SRVClients) {
if dns == "" { if dns == "" {
return s return s
} }
@ -32,7 +34,17 @@ func discoverEndpoints(dns string, ca string, insecure bool) (s srv.SRVClients)
os.Exit(1) os.Exit(1)
} }
endpoints := srvs.Endpoints endpoints := srvs.Endpoints
plog.Infof("discovered the cluster %s from %s", endpoints, dns)
if lg != nil {
lg.Info(
"discovered cluster from SRV",
zap.String("srv-server", dns),
zap.Strings("endpoints", endpoints),
)
} else {
plog.Infof("discovered the cluster %s from %s", endpoints, dns)
}
if insecure { if insecure {
return *srvs return *srvs
} }
@ -41,12 +53,41 @@ func discoverEndpoints(dns string, ca string, insecure bool) (s srv.SRVClients)
TrustedCAFile: ca, TrustedCAFile: ca,
ServerName: dns, ServerName: dns,
} }
plog.Infof("validating discovered endpoints %v", endpoints)
if lg != nil {
lg.Info(
"validating discovered SRV endpoints",
zap.String("srv-server", dns),
zap.Strings("endpoints", endpoints),
)
} else {
plog.Infof("validating discovered endpoints %v", endpoints)
}
endpoints, err = transport.ValidateSecureEndpoints(tlsInfo, endpoints) endpoints, err = transport.ValidateSecureEndpoints(tlsInfo, endpoints)
if err != nil { if err != nil {
plog.Warningf("%v", err) if lg != nil {
lg.Warn(
"failed to validate discovered endpoints",
zap.String("srv-server", dns),
zap.Strings("endpoints", endpoints),
zap.Error(err),
)
} else {
plog.Warningf("%v", err)
}
} else {
if lg != nil {
lg.Info(
"using validated discovered SRV endpoints",
zap.String("srv-server", dns),
zap.Strings("endpoints", endpoints),
)
}
}
if lg == nil {
plog.Infof("using discovered endpoints %v", endpoints)
} }
plog.Infof("using discovered endpoints %v", endpoints)
// map endpoints back to SRVClients struct with SRV data // map endpoints back to SRVClients struct with SRV data
eps := make(map[string]struct{}) eps := make(map[string]struct{})