Browse Source

etcdmain: support structured logging for discovery service

Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
Gyuho Lee 7 years ago
parent
commit
829c4479f3
4 changed files with 102 additions and 29 deletions
  1. 46 13
      etcdmain/etcd.go
  2. 9 10
      etcdmain/gateway.go
  3. 1 1
      etcdmain/grpc_proxy.go
  4. 46 5
      etcdmain/util.go

+ 46 - 13
etcdmain/etcd.go

@@ -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
 	}
 	}

+ 9 - 10
etcdmain/gateway.go

@@ -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 {

+ 1 - 1
etcdmain/grpc_proxy.go

@@ -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

+ 46 - 5
etcdmain/util.go

@@ -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{})