diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index d0aed837a7f..61c3bf458fc 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -51,6 +51,7 @@ https://github.com/elastic/beats/compare/v1.1.0...master[Check the HEAD diff] - Check column length in pgsql parser. {issue}565{565 *Topbeat* +- Fix issue with cpu.system_p being abnormally high {pull}1200[1200] *Filebeat* - Stop filebeat if filebeat is started without any prospectors defined or empty prospectors {pull}644[644] {pull}647[647] diff --git a/topbeat/beater/topbeat.go b/topbeat/beater/topbeat.go index f12cf0848d5..631b25f3547 100644 --- a/topbeat/beater/topbeat.go +++ b/topbeat/beater/topbeat.go @@ -436,9 +436,9 @@ func (t *Topbeat) addCpuPercentage(t2 *CpuTimes) { calculate := func(field2 uint64, field1 uint64) float64 { perc := 0.0 - delta := field2 - field1 + delta := int64(field2 - field1) perc = float64(delta) / float64(all_delta) - return Round(perc, .5, 2) + return Round(perc, .5, 4) } t2.UserPercent = calculate(t2.Cpu.User, t1.Cpu.User) @@ -460,7 +460,7 @@ func (t *Topbeat) addCpuPercentageList(t2 []CpuTimes) { perc := 0.0 delta := field2 - field1 perc = float64(delta) / float64(all_delta) - return Round(perc, .5, 2) + return Round(perc, .5, 4) } for i := 0; i < len(t1); i++ { diff --git a/topbeat/beater/topbeat_test.go b/topbeat/beater/topbeat_test.go index 82ff5c26582..b367762351d 100644 --- a/topbeat/beater/topbeat_test.go +++ b/topbeat/beater/topbeat_test.go @@ -104,8 +104,8 @@ func TestCpuPercentage(t *testing.T) { beat.addCpuPercentage(&cpu2) - assert.Equal(t, cpu2.UserPercent, 0.95) - assert.Equal(t, cpu2.SystemPercent, 0.04) + assert.Equal(t, cpu2.UserPercent, 0.9502) + assert.Equal(t, cpu2.SystemPercent, 0.0448) } func TestProcMemPercentage(t *testing.T) { diff --git a/vendor/github.com/elastic/gosigar/.appveyor.yml b/vendor/github.com/elastic/gosigar/.appveyor.yml index d7733836c60..50a03e5d1c6 100644 --- a/vendor/github.com/elastic/gosigar/.appveyor.yml +++ b/vendor/github.com/elastic/gosigar/.appveyor.yml @@ -25,8 +25,11 @@ install: - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/elastic/beats/master/libbeat/scripts/install-go.ps1')) - set PATH=%GOROOT%\bin;%PATH% # AppVeyor installed mingw is 32-bit only. - - cinst mingw > mingw-install.txt - - ps: Push-AppveyorArtifact mingw-install.txt + - ps: >- + if(!(Test-Path "C:\tools\mingw64\bin\gcc.exe")) { + cinst mingw > mingw-install.txt + Push-AppveyorArtifact mingw-install.txt + } - set PATH=C:\tools\mingw64\bin;%GOROOT%\bin;%PATH% - set PATH=%GOPATH%\bin;%PATH% - set GO15VENDOREXPERIMENT=1 @@ -41,6 +44,10 @@ build_script: - cd c:\gopath\src\github.com\elastic\gosigar - go get -t - go build + - go build -o examples/df/df.exe ./examples/df + - go build -o examples/free/free.exe ./examples/free + - go build -o examples/ps/ps.exe ./examples/ps + - go build -o examples/uptime/uptime.exe ./examples/uptime - appveyor AddCompilationMessage "Compile Success" # To run your custom scripts instead of automatic tests @@ -48,9 +55,14 @@ test_script: # Unit tests - ps: Add-AppveyorTest "Unit Tests" -Outcome Running - mkdir build\coverage - # TODO (#14): Currently this only runs the tests that pass. - - go test -race -cover -coverprofile=build\coverage\unit.cov -v sigar_suite_test.go sigar_windows_test.go + - go test -cover -coverprofile=build\coverage\unit.cov -coverpkg=github.com/elastic/gosigar -v . - ps: Update-AppveyorTest "Unit Tests" -Outcome Passed + - ps: Add-AppveyorTest "Running Examples" -Outcome Running + - .\examples\df\df.exe + - .\examples\free\free.exe + - .\examples\ps\ps.exe + - .\examples\uptime\uptime.exe + - ps: Update-AppveyorTest "Running Examples" -Outcome Passed after_test: - go tool cover -html=build\coverage\unit.cov -o build\coverage\unit.html diff --git a/vendor/github.com/elastic/gosigar/.gitignore b/vendor/github.com/elastic/gosigar/.gitignore index 8000dd9db47..4628c1ab5c8 100644 --- a/vendor/github.com/elastic/gosigar/.gitignore +++ b/vendor/github.com/elastic/gosigar/.gitignore @@ -1 +1,33 @@ -.vagrant +# Directories +/.vagrant +/.idea +/build + +# Files +.DS_Store +/*.iml + +# Editor swap files +*.swp +*.swo +*.swn + +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so +*.exe +*.test +*.prof +*.pyc +*.swp + +# Example binaries +examples/df/df +examples/df/df.exe +examples/free/free +examples/free/free.exe +examples/ps/ps +examples/ps/ps.exe +examples/uptime/uptime +examples/uptime/uptime.exe diff --git a/vendor/github.com/elastic/gosigar/.travis.yml b/vendor/github.com/elastic/gosigar/.travis.yml index b3a18778719..0ac266f260f 100644 --- a/vendor/github.com/elastic/gosigar/.travis.yml +++ b/vendor/github.com/elastic/gosigar/.travis.yml @@ -27,9 +27,9 @@ script: - gofmt -l . | read && echo "Code differs from gofmt's style. Run 'gofmt -w .'" 1>&2 && exit 1 || true - go vet - go build - - go test + - mkdir -p build/coverage + - go test -cover -coverprofile=build/coverage/unit.cov -coverpkg=github.com/elastic/gosigar -v . + - for i in $(ls examples); do go build -o examples/$i/$i ./examples/$i; ./examples/$i/$i; done -matrix: - allow_failures: - # Investigating linux bug with gosigar's nproc value. - - os: linux +after_success: + - bash <(curl -s https://codecov.io/bash) -f build/coverage/unit.cov diff --git a/vendor/github.com/elastic/gosigar/README.md b/vendor/github.com/elastic/gosigar/README.md index 90d51f9b1f6..e30e08a080f 100644 --- a/vendor/github.com/elastic/gosigar/README.md +++ b/vendor/github.com/elastic/gosigar/README.md @@ -9,13 +9,14 @@ in pure go/cgo, rather than cgo bindings for libsigar. ## Test drive - $ go get github.com/cloudfoundry/gosigar - $ cd $GOPATH/src/github.com/cloudfoundry/gosigar/examples - $ go run uptime.go + $ go get github.com/elastic/gosigar + $ cd $GOPATH/src/github.com/elastic/gosigar/examples/ps + $ go build + $ ./ps ## Supported platforms -Currently targeting modern flavors of darwin and linux. +Currently targeting modern flavors of darwin and linux and windows. ## License diff --git a/vendor/github.com/elastic/gosigar/concrete_sigar.go b/vendor/github.com/elastic/gosigar/concrete_sigar.go index 0e80aa4b92f..c9bfb0d06c0 100644 --- a/vendor/github.com/elastic/gosigar/concrete_sigar.go +++ b/vendor/github.com/elastic/gosigar/concrete_sigar.go @@ -1,4 +1,4 @@ -package sigar +package gosigar import ( "time" diff --git a/vendor/github.com/elastic/gosigar/concrete_sigar_test.go b/vendor/github.com/elastic/gosigar/concrete_sigar_test.go index af6a10ec62c..621ef868a45 100644 --- a/vendor/github.com/elastic/gosigar/concrete_sigar_test.go +++ b/vendor/github.com/elastic/gosigar/concrete_sigar_test.go @@ -1,85 +1,76 @@ -package sigar_test +package gosigar_test import ( + "runtime" + "testing" "time" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - sigar "github.com/elastic/gosigar" + "github.com/stretchr/testify/assert" ) -var _ = Describe("ConcreteSigar", func() { - var concreteSigar *sigar.ConcreteSigar - - BeforeEach(func() { - concreteSigar = &sigar.ConcreteSigar{} - }) - - Describe("CollectCpuStats", func() { - It("immediately makes first CPU usage available even though it's not very accurate", func() { - samplesCh, stop := concreteSigar.CollectCpuStats(500 * time.Millisecond) - - firstValue := <-samplesCh - Expect(firstValue.User).To(BeNumerically(">", 0)) - - stop <- struct{}{} - }) - - It("makes CPU usage delta values available", func() { - samplesCh, stop := concreteSigar.CollectCpuStats(500 * time.Millisecond) - - firstValue := <-samplesCh - - secondValue := <-samplesCh - Expect(secondValue.User).To(BeNumerically("<", firstValue.User)) - - stop <- struct{}{} - }) - - It("does not block", func() { - _, stop := concreteSigar.CollectCpuStats(10 * time.Millisecond) - - // Sleep long enough for samplesCh to fill at least 2 values - time.Sleep(20 * time.Millisecond) - - stop <- struct{}{} - - // If CollectCpuStats blocks it will never get here - Expect(true).To(BeTrue()) - }) - }) - - It("GetLoadAverage", func() { - avg, err := concreteSigar.GetLoadAverage() - Expect(avg.One).ToNot(BeNil()) - Expect(avg.Five).ToNot(BeNil()) - Expect(avg.Fifteen).ToNot(BeNil()) - - Expect(err).ToNot(HaveOccurred()) - }) - - It("GetMem", func() { - mem, err := concreteSigar.GetMem() - Expect(err).ToNot(HaveOccurred()) - - Expect(mem.Total).To(BeNumerically(">", 0)) - Expect(mem.Used + mem.Free).To(BeNumerically("<=", mem.Total)) - }) - - It("GetSwap", func() { - swap, err := concreteSigar.GetSwap() - Expect(err).ToNot(HaveOccurred()) - Expect(swap.Used + swap.Free).To(BeNumerically("<=", swap.Total)) - }) - - It("GetSwap", func() { - fsusage, err := concreteSigar.GetFileSystemUsage("/") - Expect(err).ToNot(HaveOccurred()) - Expect(fsusage.Total).ToNot(BeNil()) - - fsusage, err = concreteSigar.GetFileSystemUsage("T O T A L L Y B O G U S") - Expect(err).To(HaveOccurred()) - Expect(fsusage.Total).To(Equal(uint64(0))) - }) -}) +func TestConcreteCollectCpuStats(t *testing.T) { + concreteSigar := &sigar.ConcreteSigar{} + + // Immediately makes first CPU usage available even though it's not very accurate. + samplesCh, stop := concreteSigar.CollectCpuStats(500 * time.Millisecond) + firstValue := <-samplesCh + assert.True(t, firstValue.User > 0) + stop <- struct{}{} + + // Makes CPU usage delta values available + samplesCh, stop = concreteSigar.CollectCpuStats(500 * time.Millisecond) + firstValue = <-samplesCh + secondValue := <-samplesCh + assert.True(t, secondValue.User < firstValue.User) + stop <- struct{}{} + + // Does not block. + _, stop = concreteSigar.CollectCpuStats(10 * time.Millisecond) + // Sleep long enough for samplesCh to fill at least 2 values + time.Sleep(20 * time.Millisecond) + stop <- struct{}{} +} + +func TestConcreteGetLoadAverage(t *testing.T) { + concreteSigar := &sigar.ConcreteSigar{} + avg, err := concreteSigar.GetLoadAverage() + if assert.NoError(t, err) { + assert.NotNil(t, avg.One) + assert.NotNil(t, avg.Five) + assert.NotNil(t, avg.Fifteen) + } +} + +func TestConcreteGetMem(t *testing.T) { + concreteSigar := &sigar.ConcreteSigar{} + mem, err := concreteSigar.GetMem() + if assert.NoError(t, err) { + assert.True(t, mem.Total > 0) + assert.True(t, mem.Used+mem.Free <= mem.Total) + } +} + +func TestConcreteGetSwap(t *testing.T) { + concreteSigar := &sigar.ConcreteSigar{} + swap, err := concreteSigar.GetSwap() + if assert.NoError(t, err) { + assert.True(t, swap.Used+swap.Free <= swap.Total) + } +} + +func TestConcreteFileSystemUsage(t *testing.T) { + root := "/" + if runtime.GOOS == "windows" { + root = "C:\\" + } + + concreteSigar := &sigar.ConcreteSigar{} + fsusage, err := concreteSigar.GetFileSystemUsage(root) + if assert.NoError(t, err, "Error is %v", err) { + assert.True(t, fsusage.Total > 0) + } + + fsusage, err = concreteSigar.GetFileSystemUsage("T O T A L L Y B O G U S") + assert.Error(t, err) +} diff --git a/vendor/github.com/elastic/gosigar/examples/df.go b/vendor/github.com/elastic/gosigar/examples/df/df.go similarity index 78% rename from vendor/github.com/elastic/gosigar/examples/df.go rename to vendor/github.com/elastic/gosigar/examples/df/df.go index aa85b36b086..0e991aba62b 100644 --- a/vendor/github.com/elastic/gosigar/examples/df.go +++ b/vendor/github.com/elastic/gosigar/examples/df/df.go @@ -4,18 +4,19 @@ package main import ( "fmt" - "github.com/elastic/gosigar" "os" + + "github.com/elastic/gosigar" ) const output_format = "%-15s %4s %4s %5s %4s %-15s\n" func formatSize(size uint64) string { - return sigar.FormatSize(size * 1024) + return gosigar.FormatSize(size * 1024) } func main() { - fslist := sigar.FileSystemList{} + fslist := gosigar.FileSystemList{} fslist.Get() fmt.Fprintf(os.Stdout, output_format, @@ -24,7 +25,7 @@ func main() { for _, fs := range fslist.List { dir_name := fs.DirName - usage := sigar.FileSystemUsage{} + usage := gosigar.FileSystemUsage{} usage.Get(dir_name) @@ -33,7 +34,7 @@ func main() { formatSize(usage.Total), formatSize(usage.Used), formatSize(usage.Avail), - sigar.FormatPercent(usage.UsePercent()), + gosigar.FormatPercent(usage.UsePercent()), dir_name) } } diff --git a/vendor/github.com/elastic/gosigar/examples/free.go b/vendor/github.com/elastic/gosigar/examples/free/free.go similarity index 92% rename from vendor/github.com/elastic/gosigar/examples/free.go rename to vendor/github.com/elastic/gosigar/examples/free/free.go index 98f0f3bd925..57c3e4a6c4b 100644 --- a/vendor/github.com/elastic/gosigar/examples/free.go +++ b/vendor/github.com/elastic/gosigar/examples/free/free.go @@ -4,8 +4,9 @@ package main import ( "fmt" - "github.com/elastic/gosigar" "os" + + "github.com/elastic/gosigar" ) func format(val uint64) uint64 { @@ -13,8 +14,8 @@ func format(val uint64) uint64 { } func main() { - mem := sigar.Mem{} - swap := sigar.Swap{} + mem := gosigar.Mem{} + swap := gosigar.Swap{} mem.Get() swap.Get() diff --git a/vendor/github.com/elastic/gosigar/examples/ps.go b/vendor/github.com/elastic/gosigar/examples/ps.go deleted file mode 100644 index 1b1de40d98d..00000000000 --- a/vendor/github.com/elastic/gosigar/examples/ps.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2012 VMware, Inc. - -package main - -import ( - "fmt" - "github.com/elastic/gosigar" -) - -func main() { - pids := sigar.ProcList{} - pids.Get() - - // ps -eo pid,ppid,stime,time,rss,state,comm - fmt.Print(" PID PPID STIME TIME RSS S COMMAND\n") - - for _, pid := range pids.List { - state := sigar.ProcState{} - mem := sigar.ProcMem{} - time := sigar.ProcTime{} - - if err := state.Get(pid); err != nil { - continue - } - if err := mem.Get(pid); err != nil { - continue - } - if err := time.Get(pid); err != nil { - continue - } - - fmt.Printf("%5d %5d %s %s %6d %c %s\n", - pid, state.Ppid, - time.FormatStartTime(), time.FormatTotal(), - mem.Resident/1024, state.State, state.Name) - } -} diff --git a/vendor/github.com/elastic/gosigar/examples/ps/ps.go b/vendor/github.com/elastic/gosigar/examples/ps/ps.go new file mode 100644 index 00000000000..627f7766359 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/examples/ps/ps.go @@ -0,0 +1,44 @@ +// Copyright (c) 2012 VMware, Inc. + +package main + +import ( + "fmt" + "strings" + + "github.com/elastic/gosigar" +) + +func main() { + pids := gosigar.ProcList{} + pids.Get() + + // ps -eo pid,ppid,stime,time,rss,user,state,command + fmt.Print(" PID PPID STIME TIME RSS USER S COMMAND\n") + + for _, pid := range pids.List { + state := gosigar.ProcState{} + mem := gosigar.ProcMem{} + time := gosigar.ProcTime{} + args := gosigar.ProcArgs{} + + if err := state.Get(pid); err != nil { + continue + } + if err := mem.Get(pid); err != nil { + continue + } + if err := time.Get(pid); err != nil { + continue + } + if err := args.Get(pid); err != nil { + continue + } + + fmt.Printf("%5d %5d %s %s %6d %-15s %c %s\n", + pid, state.Ppid, + time.FormatStartTime(), time.FormatTotal(), + mem.Resident/1024, state.Username, state.State, + strings.Join(args.List, " ")) + } +} diff --git a/vendor/github.com/elastic/gosigar/examples/uptime.go b/vendor/github.com/elastic/gosigar/examples/uptime/uptime.go similarity index 85% rename from vendor/github.com/elastic/gosigar/examples/uptime.go rename to vendor/github.com/elastic/gosigar/examples/uptime/uptime.go index 07770f7df8b..49d895ffb14 100644 --- a/vendor/github.com/elastic/gosigar/examples/uptime.go +++ b/vendor/github.com/elastic/gosigar/examples/uptime/uptime.go @@ -4,15 +4,16 @@ package main import ( "fmt" - "github.com/elastic/gosigar" "os" "time" + + "github.com/elastic/gosigar" ) func main() { - concreteSigar := sigar.ConcreteSigar{} + concreteSigar := gosigar.ConcreteSigar{} - uptime := sigar.Uptime{} + uptime := gosigar.Uptime{} uptime.Get() avg, err := concreteSigar.GetLoadAverage() if err != nil { diff --git a/vendor/github.com/elastic/gosigar/sigar_darwin.go b/vendor/github.com/elastic/gosigar/sigar_darwin.go index e6173862d3d..1ba26667a1e 100644 --- a/vendor/github.com/elastic/gosigar/sigar_darwin.go +++ b/vendor/github.com/elastic/gosigar/sigar_darwin.go @@ -1,6 +1,6 @@ // Copyright (c) 2012 VMware, Inc. -package sigar +package gosigar /* #include diff --git a/vendor/github.com/elastic/gosigar/sigar_format.go b/vendor/github.com/elastic/gosigar/sigar_format.go index d80a64e88f8..ac56c9873c5 100644 --- a/vendor/github.com/elastic/gosigar/sigar_format.go +++ b/vendor/github.com/elastic/gosigar/sigar_format.go @@ -1,6 +1,6 @@ // Copyright (c) 2012 VMware, Inc. -package sigar +package gosigar import ( "bufio" diff --git a/vendor/github.com/elastic/gosigar/sigar_interface.go b/vendor/github.com/elastic/gosigar/sigar_interface.go index f4e99a56e7d..664bff91f0d 100644 --- a/vendor/github.com/elastic/gosigar/sigar_interface.go +++ b/vendor/github.com/elastic/gosigar/sigar_interface.go @@ -1,4 +1,4 @@ -package sigar +package gosigar import ( "time" diff --git a/vendor/github.com/elastic/gosigar/sigar_interface_test.go b/vendor/github.com/elastic/gosigar/sigar_interface_test.go index 76e891ca439..69f4a4f2775 100644 --- a/vendor/github.com/elastic/gosigar/sigar_interface_test.go +++ b/vendor/github.com/elastic/gosigar/sigar_interface_test.go @@ -1,135 +1,140 @@ -package sigar_test +package gosigar_test import ( "os" + "os/user" "path/filepath" "runtime" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" + "testing" . "github.com/elastic/gosigar" + "github.com/stretchr/testify/assert" ) -var _ = Describe("Sigar", func() { - var invalidPid = 666666 - - It("cpu", func() { - cpu := Cpu{} - err := cpu.Get() - Expect(err).ToNot(HaveOccurred()) - }) - - It("load average", func() { - avg := LoadAverage{} - err := avg.Get() - Expect(err).ToNot(HaveOccurred()) - }) - - It("uptime", func() { - uptime := Uptime{} - err := uptime.Get() - Expect(err).ToNot(HaveOccurred()) - Expect(uptime.Length).To(BeNumerically(">", 0)) - }) - - It("mem", func() { - mem := Mem{} - err := mem.Get() - Expect(err).ToNot(HaveOccurred()) - - Expect(mem.Total).To(BeNumerically(">", 0)) - Expect(mem.Used + mem.Free).To(BeNumerically("<=", mem.Total)) - }) - - It("swap", func() { - swap := Swap{} - err := swap.Get() - Expect(err).ToNot(HaveOccurred()) - Expect(swap.Used + swap.Free).To(BeNumerically("<=", swap.Total)) - }) - - It("cpu list", func() { - cpulist := CpuList{} - err := cpulist.Get() - Expect(err).ToNot(HaveOccurred()) - - nsigar := len(cpulist.List) - numcpu := runtime.NumCPU() - Expect(nsigar).To(Equal(numcpu)) - }) - - It("file system list", func() { - fslist := FileSystemList{} - err := fslist.Get() - Expect(err).ToNot(HaveOccurred()) - - Expect(len(fslist.List)).To(BeNumerically(">", 0)) - }) - - It("file system usage", func() { - fsusage := FileSystemUsage{} - err := fsusage.Get("/") - Expect(err).ToNot(HaveOccurred()) - - err = fsusage.Get("T O T A L L Y B O G U S") - Expect(err).To(HaveOccurred()) - }) - - It("proc list", func() { - pids := ProcList{} - err := pids.Get() - Expect(err).ToNot(HaveOccurred()) - - Expect(len(pids.List)).To(BeNumerically(">", 2)) - - err = pids.Get() - Expect(err).ToNot(HaveOccurred()) - }) - - It("proc state", func() { - state := ProcState{} - err := state.Get(os.Getppid()) - Expect(err).ToNot(HaveOccurred()) - - Expect([]RunState{RunStateRun, RunStateSleep}).To(ContainElement(state.State)) - Expect([]string{"go", "ginkgo"}).To(ContainElement(state.Name)) - - err = state.Get(invalidPid) - Expect(err).To(HaveOccurred()) - }) - - It("proc mem", func() { - mem := ProcMem{} - err := mem.Get(os.Getppid()) - Expect(err).ToNot(HaveOccurred()) - - err = mem.Get(invalidPid) - Expect(err).To(HaveOccurred()) - }) - - It("proc time", func() { - time := ProcTime{} - err := time.Get(os.Getppid()) - Expect(err).ToNot(HaveOccurred()) - - err = time.Get(invalidPid) - Expect(err).To(HaveOccurred()) - }) - - It("proc args", func() { - args := ProcArgs{} - err := args.Get(os.Getppid()) - Expect(err).ToNot(HaveOccurred()) - - Expect(len(args.List)).To(BeNumerically(">=", 2)) - }) - - It("proc exe", func() { - exe := ProcExe{} - err := exe.Get(os.Getppid()) - Expect(err).ToNot(HaveOccurred()) - - Expect([]string{"go", "ginkgo"}).To(ContainElement(filepath.Base(exe.Name))) - }) -}) +const invalidPid = 666666 + +func TestCpu(t *testing.T) { + cpu := Cpu{} + assert.NoError(t, cpu.Get()) +} + +func TestLoadAverage(t *testing.T) { + avg := LoadAverage{} + assert.NoError(t, avg.Get()) +} + +func TestUptime(t *testing.T) { + skipWindows(t) + uptime := Uptime{} + if assert.NoError(t, uptime.Get()) { + assert.True(t, uptime.Length > 0, "Uptime (%f) must be positive", uptime.Length) + } +} + +func TestMem(t *testing.T) { + mem := Mem{} + if assert.NoError(t, mem.Get()) { + assert.True(t, mem.Total > 0, "mem.Total (%d) must be positive", mem.Total) + assert.True(t, (mem.Used+mem.Free) <= mem.Total, + "mem.Used (%d) + mem.Free (%d) must <= mem.Total (%d)", + mem.Used, mem.Free, mem.Total) + } +} + +func TestSwap(t *testing.T) { + swap := Swap{} + if assert.NoError(t, swap.Get()) { + assert.True(t, (swap.Used+swap.Free) <= swap.Total, + "swap.Used (%d) + swap.Free (%d) must <= swap.Total (%d)", + swap.Used, swap.Free, swap.Total) + } +} + +func TestCpuList(t *testing.T) { + skipWindows(t) + cpulist := CpuList{} + if assert.NoError(t, cpulist.Get()) { + numCore := len(cpulist.List) + numCpu := runtime.NumCPU() + assert.True(t, numCore >= numCpu, "Number of cores (%d) >= number of logical CPUs (%d)", + numCore, numCpu) + } +} + +func TestFileSystemList(t *testing.T) { + fslist := FileSystemList{} + if assert.NoError(t, fslist.Get()) { + assert.True(t, len(fslist.List) > 0) + } +} + +func TestFileSystemUsage(t *testing.T) { + root := "/" + if runtime.GOOS == "windows" { + root = "C:\\" + } + fsusage := FileSystemUsage{} + if assert.NoError(t, fsusage.Get(root)) { + assert.True(t, fsusage.Total > 0) + } + assert.Error(t, fsusage.Get("T O T A L L Y B O G U S")) +} + +func TestProcList(t *testing.T) { + pids := ProcList{} + if assert.NoError(t, pids.Get()) { + assert.True(t, len(pids.List) > 2) + } +} + +func TestProcState(t *testing.T) { + u, err := user.Current() + if err != nil { + t.Fatal(err) + } + + state := ProcState{} + if assert.NoError(t, state.Get(os.Getppid())) { + assert.Contains(t, []RunState{RunStateRun, RunStateSleep}, state.State) + assert.Regexp(t, "go(.exe)?", state.Name) + assert.Equal(t, u.Username, state.Username) + } + + assert.Error(t, state.Get(invalidPid)) +} + +func TestProcMem(t *testing.T) { + mem := ProcMem{} + assert.NoError(t, mem.Get(os.Getppid())) + + assert.Error(t, mem.Get(invalidPid)) +} + +func TestProcTime(t *testing.T) { + time := ProcTime{} + assert.NoError(t, time.Get(os.Getppid())) + + assert.Error(t, time.Get(invalidPid)) +} + +func TestProcArgs(t *testing.T) { + skipWindows(t) + args := ProcArgs{} + if assert.NoError(t, args.Get(os.Getppid())) { + assert.True(t, len(args.List) >= 2) + } +} + +func TestProcExe(t *testing.T) { + skipWindows(t) + exe := ProcExe{} + if assert.NoError(t, exe.Get(os.Getppid())) { + assert.Regexp(t, "go(.exe)?", filepath.Base(exe.Name)) + } +} + +func skipWindows(t testing.TB) { + if runtime.GOOS == "windows" { + t.Skipf("Skipping test on %s", runtime.GOOS) + } +} diff --git a/vendor/github.com/elastic/gosigar/sigar_linux.go b/vendor/github.com/elastic/gosigar/sigar_linux.go index bf003e59b88..f7e0fb7a583 100644 --- a/vendor/github.com/elastic/gosigar/sigar_linux.go +++ b/vendor/github.com/elastic/gosigar/sigar_linux.go @@ -1,6 +1,6 @@ // Copyright (c) 2012 VMware, Inc. -package sigar +package gosigar import ( "bufio" diff --git a/vendor/github.com/elastic/gosigar/sigar_linux_test.go b/vendor/github.com/elastic/gosigar/sigar_linux_test.go index 6d346e1072b..7b3e5d3582d 100644 --- a/vendor/github.com/elastic/gosigar/sigar_linux_test.go +++ b/vendor/github.com/elastic/gosigar/sigar_linux_test.go @@ -1,4 +1,4 @@ -package sigar_test +package gosigar_test import ( "fmt" @@ -7,147 +7,153 @@ import ( "os" "path/filepath" "strconv" + "testing" "time" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - sigar "github.com/elastic/gosigar" + "github.com/stretchr/testify/assert" ) -func writePidStats(pid int, procName string, path string) { - stats := "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 " + - "20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 " + - "35 36 37 38 39 40" +var procd string - statContents := []byte(fmt.Sprintf("%d (%s) %s", pid, procName, stats)) - err := ioutil.WriteFile(path, statContents, 0644) - Expect(err).ToNot(HaveOccurred()) +func setUp(t testing.TB) { + var err error + procd, err = ioutil.TempDir("", "sigarTests") + if err != nil { + t.Fatal(err) + } + sigar.Procd = procd } -var _ = Describe("sigarLinux", func() { - var procd string - - BeforeEach(func() { - var err error - procd, err = ioutil.TempDir("", "sigarTests") - Expect(err).ToNot(HaveOccurred()) - sigar.Procd = procd - }) +func tearDown(t testing.TB) { + sigar.Procd = "/proc" + err := os.RemoveAll(procd) + if err != nil { + t.Fatal(err) + } +} - AfterEach(func() { - sigar.Procd = "/proc" - }) +func TestLinuxProcState(t *testing.T) { + setUp(t) + defer tearDown(t) - Describe("ProcState", func() { - var ( - pid int - pidDir string - pidStatFile string - state sigar.ProcState - ) + var procNames = []string{ + "cron", + "a very long process name", + } - BeforeEach(func() { - pid = rand.Int() - pidDir = filepath.Join(procd, strconv.Itoa(pid)) + for _, n := range procNames { + func() { + pid := rand.Int() + pidDir := filepath.Join(procd, strconv.Itoa(pid)) err := os.Mkdir(pidDir, 0755) - Expect(err).ToNot(HaveOccurred()) - pidStatFile = filepath.Join(pidDir, "stat") - state = sigar.ProcState{} - }) - - It("Knows the process name", func() { - writePidStats(pid, "cron", pidStatFile) - state.Get(pid) - Expect(state.Name).To(Equal("cron")) - }) - - It("Can handle spaces in the process name", func() { - writePidStats(pid, "a very long process name", pidStatFile) - state.Get(pid) - Expect(state.Name).To(Equal("a very long process name")) - }) - }) - - Describe("CPU", func() { - var ( - statFile string - cpu sigar.Cpu - ) - - BeforeEach(func() { - statFile = procd + "/stat" - cpu = sigar.Cpu{} - }) - - Describe("Get", func() { - It("gets CPU usage", func() { - statContents := []byte("cpu 25 1 2 3 4 5 6 7") - err := ioutil.WriteFile(statFile, statContents, 0644) - Expect(err).ToNot(HaveOccurred()) - - err = cpu.Get() - Expect(err).ToNot(HaveOccurred()) - Expect(cpu.User).To(Equal(uint64(25))) - }) - - It("ignores empty lines", func() { - statContents := []byte("cpu ") - err := ioutil.WriteFile(statFile, statContents, 0644) - Expect(err).ToNot(HaveOccurred()) - - err = cpu.Get() - Expect(err).ToNot(HaveOccurred()) - Expect(cpu.User).To(Equal(uint64(0))) - }) - }) - - Describe("CollectCpuStats", func() { - It("collects CPU usage over time", func() { - statContents := []byte("cpu 25 1 2 3 4 5 6 7") - err := ioutil.WriteFile(statFile, statContents, 0644) - Expect(err).ToNot(HaveOccurred()) - - concreteSigar := &sigar.ConcreteSigar{} - cpuUsages, stop := concreteSigar.CollectCpuStats(500 * time.Millisecond) - - Expect(<-cpuUsages).To(Equal(sigar.Cpu{ - User: uint64(25), - Nice: uint64(1), - Sys: uint64(2), - Idle: uint64(3), - Wait: uint64(4), - Irq: uint64(5), - SoftIrq: uint64(6), - Stolen: uint64(7), - })) - - statContents = []byte("cpu 30 3 7 10 25 55 36 65") - err = ioutil.WriteFile(statFile, statContents, 0644) - Expect(err).ToNot(HaveOccurred()) + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(pidDir) + pidStatFile := filepath.Join(pidDir, "stat") + writePidStats(pid, n, pidStatFile) + if err != nil { + t.Fatal(err) + } + + pidStatusFile := filepath.Join(pidDir, "status") + uid := 123456789 + writePidStatus(n, pid, uid, pidStatusFile) + if err != nil { + t.Fatal(err) + } + + state := sigar.ProcState{} + if assert.NoError(t, state.Get(pid)) { + assert.Equal(t, n, state.Name) + assert.Equal(t, strconv.Itoa(uid), state.Username) + } + }() + } +} - Expect(<-cpuUsages).To(Equal(sigar.Cpu{ - User: uint64(5), - Nice: uint64(2), - Sys: uint64(5), - Idle: uint64(7), - Wait: uint64(21), - Irq: uint64(50), - SoftIrq: uint64(30), - Stolen: uint64(58), - })) +func TestLinuxCPU(t *testing.T) { + setUp(t) + defer tearDown(t) + + tests := []struct { + stat string + user uint64 + }{ + {"cpu 25 1 2 3 4 5 6 7", 25}, + // Ignore empty lines + {"cpu ", 0}, + } + + statFile := procd + "/stat" + for _, test := range tests { + func() { + statContents := []byte(test.stat) + err := ioutil.WriteFile(statFile, statContents, 0644) + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(statFile) + + cpu := sigar.Cpu{} + if assert.NoError(t, cpu.Get()) { + assert.Equal(t, uint64(test.user), cpu.User, "cpu.User") + } + }() + } +} - stop <- struct{}{} - }) - }) - }) +func TestLinuxCollectCpuStats(t *testing.T) { + setUp(t) + defer tearDown(t) + + statFile := procd + "/stat" + statContents := []byte("cpu 25 1 2 3 4 5 6 7") + err := ioutil.WriteFile(statFile, statContents, 0644) + if err != nil { + t.Fatal(err) + } + + concreteSigar := &sigar.ConcreteSigar{} + cpuUsages, stop := concreteSigar.CollectCpuStats(500 * time.Millisecond) + + assert.Equal(t, sigar.Cpu{ + User: uint64(25), + Nice: uint64(1), + Sys: uint64(2), + Idle: uint64(3), + Wait: uint64(4), + Irq: uint64(5), + SoftIrq: uint64(6), + Stolen: uint64(7), + }, <-cpuUsages) + + statContents = []byte("cpu 30 3 7 10 25 55 36 65") + err = ioutil.WriteFile(statFile, statContents, 0644) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, sigar.Cpu{ + User: uint64(5), + Nice: uint64(2), + Sys: uint64(5), + Idle: uint64(7), + Wait: uint64(21), + Irq: uint64(50), + SoftIrq: uint64(30), + Stolen: uint64(58), + }, <-cpuUsages) + + stop <- struct{}{} +} - Describe("Mem", func() { - var meminfoFile string - BeforeEach(func() { - meminfoFile = procd + "/meminfo" +func TestLinuxMemAndSwap(t *testing.T) { + setUp(t) + defer tearDown(t) - meminfoContents := ` + meminfoContents := ` MemTotal: 374256 kB MemFree: 274460 kB Buffers: 9764 kB @@ -191,80 +197,77 @@ Hugepagesize: 2048 kB DirectMap4k: 59328 kB DirectMap2M: 333824 kB ` - err := ioutil.WriteFile(meminfoFile, []byte(meminfoContents), 0444) - Expect(err).ToNot(HaveOccurred()) - }) - - It("returns correct memory info", func() { - mem := sigar.Mem{} - err := mem.Get() - Expect(err).ToNot(HaveOccurred()) - - Expect(mem.Total).To(BeNumerically("==", 374256*1024)) - Expect(mem.Free).To(BeNumerically("==", 274460*1024)) - }) - }) - Describe("Swap", func() { - var meminfoFile string - BeforeEach(func() { - meminfoFile = procd + "/meminfo" + meminfoFile := procd + "/meminfo" + err := ioutil.WriteFile(meminfoFile, []byte(meminfoContents), 0444) + if err != nil { + t.Fatal(err) + } + + mem := sigar.Mem{} + if assert.NoError(t, mem.Get()) { + assert.Equal(t, uint64(374256*1024), mem.Total) + assert.Equal(t, uint64(274460*1024), mem.Free) + } + + swap := sigar.Swap{} + if assert.NoError(t, swap.Get()) { + assert.Equal(t, uint64(786428*1024), swap.Total) + assert.Equal(t, uint64(786428*1024), swap.Free) + } +} - meminfoContents := ` -MemTotal: 374256 kB -MemFree: 274460 kB -Buffers: 9764 kB -Cached: 38648 kB -SwapCached: 0 kB -Active: 33772 kB -Inactive: 31184 kB -Active(anon): 16572 kB -Inactive(anon): 552 kB -Active(file): 17200 kB -Inactive(file): 30632 kB -Unevictable: 0 kB -Mlocked: 0 kB -SwapTotal: 786428 kB -SwapFree: 786428 kB -Dirty: 0 kB -Writeback: 0 kB -AnonPages: 16564 kB -Mapped: 6612 kB -Shmem: 584 kB -Slab: 19092 kB -SReclaimable: 9128 kB -SUnreclaim: 9964 kB -KernelStack: 672 kB -PageTables: 1864 kB -NFS_Unstable: 0 kB -Bounce: 0 kB -WritebackTmp: 0 kB -CommitLimit: 973556 kB -Committed_AS: 55880 kB -VmallocTotal: 34359738367 kB -VmallocUsed: 21428 kB -VmallocChunk: 34359713596 kB -HardwareCorrupted: 0 kB -AnonHugePages: 0 kB -HugePages_Total: 0 -HugePages_Free: 0 -HugePages_Rsvd: 0 -HugePages_Surp: 0 -Hugepagesize: 2048 kB -DirectMap4k: 59328 kB -DirectMap2M: 333824 kB -` - err := ioutil.WriteFile(meminfoFile, []byte(meminfoContents), 0444) - Expect(err).ToNot(HaveOccurred()) - }) +func writePidStats(pid int, procName string, path string) error { + stats := "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 " + + "20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 " + + "35 36 37 38 39 40" - It("returns correct memory info", func() { - swap := sigar.Swap{} - err := swap.Get() - Expect(err).ToNot(HaveOccurred()) + statContents := []byte(fmt.Sprintf("%d (%s) %s", pid, procName, stats)) + return ioutil.WriteFile(path, statContents, 0644) +} - Expect(swap.Total).To(BeNumerically("==", 786428*1024)) - Expect(swap.Free).To(BeNumerically("==", 786428*1024)) - }) - }) -}) +func writePidStatus(name string, pid int, uid int, pidStatusFile string) error { + status := ` +Name: %s +State: R (running) +Tgid: 5452 +Pid: %d +PPid: 743 +TracerPid: 0 +Uid: %d %d %d %d +Gid: 100 100 100 100 +FDSize: 256 +Groups: 100 14 16 +VmPeak: 5004 kB +VmSize: 5004 kB +VmLck: 0 kB +VmHWM: 476 kB +VmRSS: 476 kB +RssAnon: 352 kB +RssFile: 120 kB +RssShmem: 4 kB +VmData: 156 kB +VmStk: 88 kB +VmExe: 68 kB +VmLib: 1412 kB +VmPTE: 20 kb +VmSwap: 0 kB +HugetlbPages: 0 kB +Threads: 1 +SigQ: 0/28578 +SigPnd: 0000000000000000 +ShdPnd: 0000000000000000 +SigBlk: 0000000000000000 +SigIgn: 0000000000000000 +SigCgt: 0000000000000000 +CapInh: 00000000fffffeff +CapPrm: 0000000000000000 +CapEff: 0000000000000000 +CapBnd: ffffffffffffffff +Seccomp: 0 +voluntary_ctxt_switches: 0 +nonvoluntary_ctxt_switches: 1` + + statusContents := []byte(fmt.Sprintf(status, name, pid, uid)) + return ioutil.WriteFile(pidStatusFile, statusContents, 0644) +} diff --git a/vendor/github.com/elastic/gosigar/sigar_suite_test.go b/vendor/github.com/elastic/gosigar/sigar_suite_test.go deleted file mode 100644 index 44287f6319f..00000000000 --- a/vendor/github.com/elastic/gosigar/sigar_suite_test.go +++ /dev/null @@ -1,13 +0,0 @@ -package sigar_test - -import ( - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - "testing" -) - -func TestGosigar(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Gosigar Suite") -} diff --git a/vendor/github.com/elastic/gosigar/sigar_test.go b/vendor/github.com/elastic/gosigar/sigar_test.go deleted file mode 100644 index f9fb52beba7..00000000000 --- a/vendor/github.com/elastic/gosigar/sigar_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build linux darwin windows - -package sigar_test - -import ( - "os" - "os/user" - "testing" - - sigar "github.com/elastic/gosigar" -) - -func TestProcStateUsername(t *testing.T) { - proc := sigar.ProcState{} - err := proc.Get(os.Getpid()) - if err != nil { - t.Fatal(err) - } - - user, err := user.Current() - if err != nil { - t.Fatal(err) - } - - if user.Username != proc.Username { - t.Fatalf("Usernames don't match, expected %s, but got %s", - user.Username, proc.Username) - } -} diff --git a/vendor/github.com/elastic/gosigar/sigar_unix.go b/vendor/github.com/elastic/gosigar/sigar_unix.go index 963d2531185..82fe8f06523 100644 --- a/vendor/github.com/elastic/gosigar/sigar_unix.go +++ b/vendor/github.com/elastic/gosigar/sigar_unix.go @@ -2,7 +2,7 @@ // +build darwin freebsd linux netbsd openbsd -package sigar +package gosigar import "syscall" diff --git a/vendor/github.com/elastic/gosigar/sigar_util.go b/vendor/github.com/elastic/gosigar/sigar_util.go index a02df9419c0..bf93b02b247 100644 --- a/vendor/github.com/elastic/gosigar/sigar_util.go +++ b/vendor/github.com/elastic/gosigar/sigar_util.go @@ -1,6 +1,6 @@ // Copyright (c) 2012 VMware, Inc. -package sigar +package gosigar import ( "unsafe" diff --git a/vendor/github.com/elastic/gosigar/sigar_windows.go b/vendor/github.com/elastic/gosigar/sigar_windows.go index e9f744b7d3c..7ea9dff1335 100644 --- a/vendor/github.com/elastic/gosigar/sigar_windows.go +++ b/vendor/github.com/elastic/gosigar/sigar_windows.go @@ -1,6 +1,6 @@ // Copyright (c) 2012 VMware, Inc. -package sigar +package gosigar // #include // #include @@ -19,8 +19,7 @@ import ( ) var ( - modpsapi = syscall.NewLazyDLL("psapi.dll") - modkernel32 = syscall.NewLazyDLL("kernel32.dll") + modpsapi = syscall.NewLazyDLL("psapi.dll") procEnumProcesses = modpsapi.NewProc("EnumProcesses") procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") @@ -115,25 +114,21 @@ func (self *Swap) Get() error { } func (self *Cpu) Get() error { - - var lpIdleTime, lpKernelTime, lpUserTime C.FILETIME - - succeeded := C.GetSystemTimes(&lpIdleTime, &lpKernelTime, &lpUserTime) - if succeeded == C.FALSE { - return syscall.GetLastError() + var idleTime, kernelTime, userTime syscall.Filetime + err := _GetSystemTimes(&idleTime, &kernelTime, &userTime) + if err != nil { + return err } - LOT := float64(0.0000001) - HIT := (LOT * 4294967296.0) - - idle := ((HIT * float64(lpIdleTime.dwHighDateTime)) + (LOT * float64(lpIdleTime.dwLowDateTime))) - user := ((HIT * float64(lpUserTime.dwHighDateTime)) + (LOT * float64(lpUserTime.dwLowDateTime))) - kernel := ((HIT * float64(lpKernelTime.dwHighDateTime)) + (LOT * float64(lpKernelTime.dwLowDateTime))) - system := (kernel - idle) + idleNs := FiletimeToDuration(&idleTime) + // Kernel time value also includes the amount of time the system has been idle. + sysNs := FiletimeToDuration(&kernelTime) - idleNs + userNs := FiletimeToDuration(&userTime) - self.Idle = uint64(idle) - self.User = uint64(user) - self.Sys = uint64(system) + // CPU times are reported in milliseconds by gosigar. + self.Idle = uint64(idleNs / time.Millisecond) + self.Sys = uint64(sysNs / time.Millisecond) + self.User = uint64(userNs / time.Millisecond) return nil } @@ -246,7 +241,7 @@ func (self *ProcList) Get() error { func FiletimeToDuration(ft *syscall.Filetime) time.Duration { n := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) // in 100-nanosecond intervals - return time.Duration(n*100) * time.Nanosecond + return time.Duration(n * 100) } func CarrayToString(c [MAX_PATH]byte) string { @@ -486,7 +481,11 @@ func (self *FileSystemUsage) Get(path string) error { succeeded := C.GetDiskFreeSpaceEx((*C.CHAR)(pathChars), &availableBytes, &totalBytes, &totalFreeBytes) if succeeded == C.FALSE { - return syscall.GetLastError() + err := syscall.GetLastError() + if err == nil { + err = fmt.Errorf("unknown GetDiskFreeSpaceEx error") + } + return err } self.Total = *(*uint64)(unsafe.Pointer(&totalBytes)) diff --git a/vendor/github.com/elastic/gosigar/sigar_windows_test.go b/vendor/github.com/elastic/gosigar/sigar_windows_test.go deleted file mode 100644 index f0db19501ec..00000000000 --- a/vendor/github.com/elastic/gosigar/sigar_windows_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package sigar_test - -import ( - "math" - "os" - "os/user" - "strings" - "testing" - - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - - sigar "github.com/elastic/gosigar" -) - -var _ = Describe("SigarWindows", func() { - Describe("Memory", func() { - It("gets the total memory", func() { - mem := sigar.Mem{} - err := mem.Get() - - Ω(err).ShouldNot(HaveOccurred()) - Ω(mem.Total).Should(BeNumerically(">", 0)) - }) - }) - - Describe("Disk", func() { - It("gets the total disk space", func() { - usage := sigar.FileSystemUsage{} - err := usage.Get(os.TempDir()) - - Ω(err).ShouldNot(HaveOccurred()) - Ω(usage.Total).Should(BeNumerically(">", 0)) - }) - }) - - Describe("Process", func() { - It("gets the current process user name", func() { - proc := sigar.ProcState{} - err := proc.Get(os.Getpid()) - user, usererr := user.Current() - - Ω(err).ShouldNot(HaveOccurred()) - Ω(usererr).ShouldNot(HaveOccurred()) - Ω(proc.Username).Should(Equal(user.Username)) - }) - }) -}) - -func TestProcArgs(t *testing.T) { - args := sigar.ProcArgs{} - err := args.Get(os.Getpid()) - if err != nil { - t.Fatal(err) - } - - if len(args.List) == 0 { - t.Fatalf("Expected at least one arg") - } -} - -func TestProcArgsUnknown(t *testing.T) { - args := sigar.ProcArgs{} - err := args.Get(math.MaxInt32) - if err == nil { - t.Fatal("Expected process not found") - } - - if !strings.Contains(err.Error(), "Process not found") { - t.Fatal("Expected error containing 'Process not found'") - } -} diff --git a/vendor/github.com/elastic/gosigar/syscall_windows.go b/vendor/github.com/elastic/gosigar/syscall_windows.go new file mode 100644 index 00000000000..f3427d5f791 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/syscall_windows.go @@ -0,0 +1,9 @@ +package gosigar + +// Use "GOOS=windows go generate -v -x ." to generate the source. + +// Add -trace to enable debug prints around syscalls. +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go + +// Windows API calls +//sys _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) = kernel32.GetSystemTimes diff --git a/vendor/github.com/elastic/gosigar/zsyscall_windows.go b/vendor/github.com/elastic/gosigar/zsyscall_windows.go new file mode 100644 index 00000000000..61b14edf6e5 --- /dev/null +++ b/vendor/github.com/elastic/gosigar/zsyscall_windows.go @@ -0,0 +1,26 @@ +// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT + +package gosigar + +import "unsafe" +import "syscall" + +var _ unsafe.Pointer + +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + + procGetSystemTimes = modkernel32.NewProc("GetSystemTimes") +) + +func _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) { + r1, _, e1 := syscall.Syscall(procGetSystemTimes.Addr(), 3, uintptr(unsafe.Pointer(idleTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime))) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +}