From 52f7733a59f89b02fc87e3deb6ba85cbb0f80ce2 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Mon, 8 Nov 2021 16:34:36 -0800 Subject: [PATCH 1/3] stub out pidusage calls for windows, and also check errors --- metrics/monitors.go | 47 +++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/metrics/monitors.go b/metrics/monitors.go index 6a9b973..e445531 100644 --- a/metrics/monitors.go +++ b/metrics/monitors.go @@ -8,6 +8,7 @@ import ( "github.com/struCoder/pidusage" "os" "path" + "runtime" "sync" "time" ) @@ -31,8 +32,8 @@ type Monitors struct { } // Start initializes a Monitors's monitors -func (mp *Monitors) Start(ts tapir.Service, configDir string, log bool) { - mp.log = log +func (mp *Monitors) Start(ts tapir.Service, configDir string, doLogging bool) { + mp.log = doLogging mp.configDir = configDir mp.starttime = time.Now() mp.breakChannel = make(chan bool) @@ -48,18 +49,36 @@ func (mp *Monitors) Start(ts tapir.Service, configDir string, log bool) { }) var pidUsageLock sync.Mutex - mp.CPU = NewMonitorHistory(Percent, Average, func() float64 { - pidUsageLock.Lock() - defer pidUsageLock.Unlock() - sysInfo, _ := pidusage.GetStat(os.Getpid()) - return float64(sysInfo.CPU) - }) - mp.Memory = NewMonitorHistory(MegaBytes, Average, func() float64 { - pidUsageLock.Lock() - defer pidUsageLock.Unlock() - sysInfo, _ := pidusage.GetStat(os.Getpid()) - return float64(sysInfo.Memory) - }) + // pidusage doesn't support windows + if runtime.GOOS != "windows" { + mp.CPU = NewMonitorHistory(Percent, Average, func() float64 { + pidUsageLock.Lock() + defer pidUsageLock.Unlock() + sysInfo, err := pidusage.GetStat(os.Getpid()) + if err != nil { + log.Errorf("pidusage.GetStat failed with: %s", err) + return 0.0 + } + return float64(sysInfo.CPU) + }) + mp.Memory = NewMonitorHistory(MegaBytes, Average, func() float64 { + pidUsageLock.Lock() + defer pidUsageLock.Unlock() + sysInfo, err := pidusage.GetStat(os.Getpid()) + if err != nil { + log.Errorf("pidusage.GetStat failed with: %s", err) + return 0.0 + } + return float64(sysInfo.Memory) + }) + } else { + mp.CPU = NewMonitorHistory(Percent, Average, func() float64 { + return 0.0 + }) + mp.Memory = NewMonitorHistory(MegaBytes, Average, func() float64 { + return 0.0 + }) + } // TODO: replace with ts. mp.ClientConns = NewMonitorHistory(Count, Average, func() float64 { return float64(ts.Metrics().ConnectionCount) }) From 92c6979b2b5d07e24e7bbce5656971800051bbf0 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Mon, 8 Nov 2021 17:18:36 -0800 Subject: [PATCH 2/3] README update for windows build instructions --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 80d0d56..5943ac8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ # Cwtch Server +## Building + +Pretty straight forward: +- build the app in `app/` with `go build` +- build the docker container in `docker/` with `docker build . -t openpriv/server` + +### Windows + +The server package relies on sqlite which in turn requires the use of CGO. As per [this issue](https://github.com/golang/go/issues/12029) that means [TDM-GCC](https://jmeubank.github.io/tdm-gcc/download/) is required to be installed and used to compile on Windows + ## Running - cd app From 851b6000d664462db47fcf7c83f65ed40d69774f Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Mon, 8 Nov 2021 17:41:31 -0800 Subject: [PATCH 3/3] add monitors test --- metrics/monitors_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 metrics/monitors_test.go diff --git a/metrics/monitors_test.go b/metrics/monitors_test.go new file mode 100644 index 0000000..1da9c26 --- /dev/null +++ b/metrics/monitors_test.go @@ -0,0 +1,30 @@ +package metrics + +import ( + tor2 "git.openprivacy.ca/cwtch.im/tapir/networks/tor" + "git.openprivacy.ca/openprivacy/log" + "os" + "path/filepath" + "testing" + "time" +) + +func TestMonitors(t *testing.T) { + log.SetLevel(log.LevelInfo) + os.RemoveAll("testLog") + os.Mkdir("testLog", 0700) + service := new(tor2.BaseOnionService) + mp := Monitors{} + mp.Start(service, "testLog", true) + log.Infof("sleeping for minute to give to for monitors to trigger...") + // wait a minute for it to trigger + time.Sleep(62 * time.Second) + + // it didn't segfault? that's good, did it create a log file? + if _, err := os.Stat(filepath.Join("testLog", "serverMonitorReport.txt")); err != nil { + t.Errorf("serverMonitorReport.txt not generated") + } + + mp.Stop() + os.RemoveAll("testLog") +}