dbtester/agent/command.go

127 lines
5.2 KiB
Go

// Copyright 2017 CoreOS, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package agent
import (
"net"
"os"
"path/filepath"
"github.com/coreos/dbtester/dbtesterpb"
"github.com/coreos/dbtester/pkg/netutil"
"github.com/coreos/dbtester/pkg/ntp"
"github.com/coreos/pkg/capnslog"
"github.com/gyuho/psn"
"github.com/spf13/cobra"
"google.golang.org/grpc"
)
type flags struct {
agentLog string
databaseLog string
systemMetricsCSV string
systemMetricsCSVInterpolated string
javaExec string
etcdExec string
zetcdExec string
cetcdExec string
consulExec string
zkWorkDir string
zkDataDir string
zkConfig string
etcdDataDir string
consulDataDir string
grpcPort string
diskDevice string
networkInterface string
clientNumPath string
}
var globalFlags flags
func init() {
dn, err := psn.GetDevice("/")
if err != nil {
plog.Warningf("cannot get disk device mounted at '/' (%v)", err)
}
nm, err := netutil.GetDefaultInterfaces()
if err != nil {
plog.Warningf("cannot detect default network interface (%v)", err)
}
var nt string
for k := range nm {
nt = k
break
}
Command.PersistentFlags().StringVar(&globalFlags.agentLog, "agent-log", filepath.Join(homeDir(), "agent.log"), "agent log path.")
Command.PersistentFlags().StringVar(&globalFlags.databaseLog, "database-log", filepath.Join(homeDir(), "database.log"), "Database log path.")
Command.PersistentFlags().StringVar(&globalFlags.systemMetricsCSV, "system-metrics-csv", filepath.Join(homeDir(), "server-system-metrics.csv"), "Raw system metrics data path.")
Command.PersistentFlags().StringVar(&globalFlags.systemMetricsCSVInterpolated, "system-metrics-csv-interpolated", filepath.Join(homeDir(), "server-system-metrics-interpolated.csv"), "Interpolated system metrics data path.")
Command.PersistentFlags().StringVar(&globalFlags.javaExec, "java-exec", "/usr/bin/java", "Java executable binary path (needed for Zookeeper).")
Command.PersistentFlags().StringVar(&globalFlags.etcdExec, "etcd-exec", filepath.Join(os.Getenv("GOPATH"), "bin/etcd"), "etcd executable binary path.")
Command.PersistentFlags().StringVar(&globalFlags.zetcdExec, "zetcd-exec", filepath.Join(os.Getenv("GOPATH"), "bin/zetcd"), "zetcd executable binary path .")
Command.PersistentFlags().StringVar(&globalFlags.cetcdExec, "cetcd-exec", filepath.Join(os.Getenv("GOPATH"), "bin/cetcd"), "cetcd executable binary path .")
Command.PersistentFlags().StringVar(&globalFlags.consulExec, "consul-exec", filepath.Join(os.Getenv("GOPATH"), "bin/consul"), "Consul executable binary path.")
Command.PersistentFlags().StringVar(&globalFlags.zkWorkDir, "zookeeper-work-dir", filepath.Join(homeDir(), "zookeeper"), "Zookeeper working directory.")
Command.PersistentFlags().StringVar(&globalFlags.zkDataDir, "zookeeper-data-dir", filepath.Join(homeDir(), "zookeeper/zookeeper.data"), "Zookeeper data directory.")
Command.PersistentFlags().StringVar(&globalFlags.zkConfig, "zookeeper-config", filepath.Join(homeDir(), "zookeeper/zookeeper.config"), "Zookeeper configuration file path.")
Command.PersistentFlags().StringVar(&globalFlags.etcdDataDir, "etcd-data-dir", filepath.Join(homeDir(), "etcd.data"), "etcd data directory.")
Command.PersistentFlags().StringVar(&globalFlags.consulDataDir, "consul-data-dir", filepath.Join(homeDir(), "consul.data"), "Consul data directory.")
Command.PersistentFlags().StringVar(&globalFlags.grpcPort, "agent-port", ":3500", "Port to server agent gRPC server.")
Command.PersistentFlags().StringVar(&globalFlags.diskDevice, "disk-device", dn, "Disk device to collect disk statistics metrics from.")
Command.PersistentFlags().StringVar(&globalFlags.networkInterface, "network-interface", nt, "Network interface to record in/outgoing packets.")
Command.PersistentFlags().StringVar(&globalFlags.clientNumPath, "client-num-path", filepath.Join(homeDir(), "client-num"), "File path to store client number.")
}
// Command implements 'agent' command.
var Command = &cobra.Command{
Use: "agent",
Short: "Database 'agent' in remote servers.",
RunE: commandFunc,
}
func commandFunc(cmd *cobra.Command, args []string) error {
no, nerr := ntp.DefaultSync()
plog.Infof("npt update output: %q", no)
plog.Infof("npt update error: %v", nerr)
f, err := openToAppend(globalFlags.agentLog)
if err != nil {
return err
}
defer f.Close()
capnslog.SetFormatter(capnslog.NewPrettyFormatter(f, false))
var (
grpcServer = grpc.NewServer()
sender = NewServer()
)
ln, err := net.Listen("tcp", globalFlags.grpcPort)
if err != nil {
return err
}
dbtesterpb.RegisterTransporterServer(grpcServer, sender)
plog.Infof("agent started with gRPC %s (log path %q)", globalFlags.grpcPort, globalFlags.agentLog)
return grpcServer.Serve(ln)
}