@@ -30,17 +30,22 @@ import (
3030 "io"
3131 "log"
3232 "os"
33+ "os/exec"
34+ "path/filepath"
3335 "strings"
3436 "sync"
3537 "time"
3638
3739 "github.com/linuxsuren/api-testing/pkg/apispec"
3840 "github.com/linuxsuren/api-testing/pkg/limit"
3941 "github.com/linuxsuren/api-testing/pkg/runner"
42+ "github.com/linuxsuren/api-testing/pkg/runner/monitor"
4043 "github.com/linuxsuren/api-testing/pkg/testing"
44+ fakeruntime "github.com/linuxsuren/go-fake-runtime"
4145 "github.com/spf13/cobra"
4246 "github.com/spf13/pflag"
4347 "golang.org/x/sync/semaphore"
48+ "google.golang.org/grpc"
4449)
4550
4651type runOption struct {
@@ -63,14 +68,15 @@ type runOption struct {
6368 level string
6469 caseItems []string
6570 githubReportOption * runner.GithubPRCommentOption
71+ monitorDocker string
6672
6773 // for internal use
6874 loader testing.Loader
6975}
7076
7177func newDefaultRunOption () * runOption {
7278 return & runOption {
73- reporter : runner .NewMemoryTestReporter (),
79+ reporter : runner .NewMemoryTestReporter (nil , "" ),
7480 reportWriter : runner .NewResultWriter (os .Stdout ),
7581 loader : testing .NewFileLoader (),
7682 githubReportOption : & runner.GithubPRCommentOption {},
@@ -112,6 +118,7 @@ See also https://github.com/LinuxSuRen/api-testing/tree/master/sample`,
112118 flags .Int64VarP (& opt .thread , "thread" , "" , 1 , "Threads of the execution" )
113119 flags .Int32VarP (& opt .qps , "qps" , "" , 5 , "QPS" )
114120 flags .Int32VarP (& opt .burst , "burst" , "" , 5 , "burst" )
121+ flags .StringVarP (& opt .monitorDocker , "monitor-docker" , "" , "" , "The docker container name to monitor" )
115122 addGitHubReportFlags (flags , opt .githubReportOption )
116123 return
117124}
@@ -163,16 +170,56 @@ func (o *runOption) preRunE(cmd *cobra.Command, args []string) (err error) {
163170 }
164171 }
165172
173+ if err == nil {
174+ err = o .startMonitor ()
175+ }
176+
166177 o .caseItems = args
167178 return
168179}
169180
181+ func (o * runOption ) startMonitor () (err error ) {
182+ if o .monitorDocker == "" {
183+ return
184+ }
185+
186+ var monitorBin string
187+ if monitorBin , err = exec .LookPath ("atest-monitor-docker" ); err != nil {
188+ return
189+ }
190+
191+ sockFile := os .ExpandEnv (fmt .Sprintf ("$HOME/.config/atest/%s.sock" , "atest-monitor-docker" ))
192+ os .MkdirAll (filepath .Dir (sockFile ), 0755 )
193+
194+ execer := fakeruntime.DefaultExecer {}
195+ go func (socketURL , plugin string ) {
196+ if err = execer .RunCommandWithIO (plugin , "" , os .Stdout , os .Stderr , "server" , "--socket" , socketURL ); err != nil {
197+ log .Printf ("failed to start %s, error: %v" , socketURL , err )
198+ }
199+ }(sockFile , monitorBin )
200+
201+ for i := 0 ; i < 6 ; i ++ {
202+ _ , fErr := os .Stat (sockFile )
203+ if fErr == nil {
204+ break
205+ }
206+ time .Sleep (time .Second )
207+ }
208+
209+ var conn * grpc.ClientConn
210+ monitorServer := fmt .Sprintf ("unix://%s" , sockFile )
211+ if conn , err = grpc .Dial (monitorServer , grpc .WithInsecure ()); err == nil {
212+ o .reporter = runner .NewMemoryTestReporter (monitor .NewMonitorClient (conn ), o .monitorDocker )
213+ }
214+ return
215+ }
216+
170217func (o * runOption ) runE (cmd * cobra.Command , args []string ) (err error ) {
171218 o .startTime = time .Now ()
172219 o .context = cmd .Context ()
173220 o .limiter = limit .NewDefaultRateLimiter (o .qps , o .burst )
174221 defer func () {
175- cmd .Printf ("consume : %s\n " , time .Since (o .startTime ).String ())
222+ cmd .Printf ("\n consume : %s\n " , time .Since (o .startTime ).String ())
176223 o .limiter .Stop ()
177224 }()
178225
@@ -195,6 +242,7 @@ func (o *runOption) runE(cmd *cobra.Command, args []string) (err error) {
195242 var reportErr error
196243 var results runner.ReportResultSlice
197244 if results , reportErr = o .reporter .ExportAllReportResults (); reportErr == nil {
245+ o .reportWriter .WithResourceUsage (o .reporter .GetResourceUsage ())
198246 outputErr := o .reportWriter .Output (results )
199247 println (cmd , outputErr , "failed to Output all reports" , outputErr )
200248 }
0 commit comments