diff --git a/agent/server.go b/agent/server.go index 29959793..0b550d2c 100644 --- a/agent/server.go +++ b/agent/server.go @@ -23,6 +23,7 @@ import ( "time" "github.com/coreos/dbtester/agent/agentpb" + "github.com/gyuho/psn" "golang.org/x/net/context" ) @@ -39,10 +40,13 @@ type transporterServer struct { proxyCmd *exec.Cmd proxyPid int64 + metricsCSV *psn.CSV + // trigger log uploads to cloud storage // this should be triggered before we shut down // the agent server uploadSig chan struct{} + csvReady chan struct{} // notified after all tests finish notifier chan os.Signal @@ -55,6 +59,7 @@ func NewServer() agentpb.TransporterServer { return &transporterServer{ uploadSig: make(chan struct{}, 1), + csvReady: make(chan struct{}), notifier: notifier, } } @@ -214,6 +219,7 @@ func (t *transporterServer) Transfer(ctx context.Context, r *agentpb.Request) (* } t.uploadSig <- struct{}{} + <-t.csvReady if err := uploadLog(&globalFlags, t); err != nil { plog.Warningf("uploadLog error %v", err) diff --git a/agent/system_metrics.go b/agent/system_metrics.go index 6fb7e7a0..61057923 100644 --- a/agent/system_metrics.go +++ b/agent/system_metrics.go @@ -38,6 +38,7 @@ func collectMetrics(fs *flags, t *transporterServer) error { if err := c.Add(); err != nil { return err } + t.metricsCSV = c go func() { for { @@ -49,10 +50,16 @@ func collectMetrics(fs *flags, t *transporterServer) error { } case <-t.uploadSig: - plog.Info("upload signal received; returning") + plog.Infof("upload signal received; saving CSV at %q", t.metricsCSV.FilePath) + if err := t.metricsCSV.Save(); err != nil { + plog.Errorf("psn.CSV.Save error %v", err) + } else { + plog.Infof("CSV saved at %q", t.metricsCSV.FilePath) + } + close(t.csvReady) return - case sig := <-notifier: + case sig := <-t.notifier: plog.Infof("signal received %q", sig.String()) return }