diff options
author | Artjoms Rimdjonoks <artjoms.rimdjonoks@zabbix.com> | 2022-01-06 18:30:39 +0300 |
---|---|---|
committer | Artjoms Rimdjonoks <artjoms.rimdjonoks@zabbix.com> | 2022-01-06 18:30:39 +0300 |
commit | 3053b35a2f07377107fc74fcba325d11320a6f91 (patch) | |
tree | 42a5e968d3e8d52d7d9860a825d30dc112648e05 | |
parent | a7043a2c2c26d4d97b6eb4413ece3695d8222e6b (diff) | |
parent | 9745fdfa442c090f3d0c8b344e98d23920ab4c42 (diff) |
...G...... [ZBX-20269] added handling of performance counter with negative denominator value
-rw-r--r-- | ChangeLog.d/bugfix/ZBX-20269 | 1 | ||||
-rw-r--r-- | src/go/pkg/win32/pdh.go | 36 |
2 files changed, 32 insertions, 5 deletions
diff --git a/ChangeLog.d/bugfix/ZBX-20269 b/ChangeLog.d/bugfix/ZBX-20269 new file mode 100644 index 00000000000..52da1545629 --- /dev/null +++ b/ChangeLog.d/bugfix/ZBX-20269 @@ -0,0 +1 @@ +...G...... [ZBX-20269] added handling of performance counter with negative denominator value (arimdjonoks) diff --git a/src/go/pkg/win32/pdh.go b/src/go/pkg/win32/pdh.go index 8c23bf384d5..fc4db5d4bc0 100644 --- a/src/go/pkg/win32/pdh.go +++ b/src/go/pkg/win32/pdh.go @@ -25,8 +25,11 @@ import ( "errors" "fmt" "syscall" + "time" "unsafe" + "zabbix.com/pkg/log" + "golang.org/x/sys/windows" ) @@ -54,9 +57,10 @@ const ( PDH_CSTATUS_NEW_DATA = 0x00000001 PDH_CSTATUS_INVALID_DATA = 0xC0000BBA - PDH_MORE_DATA = 0x800007D2 - PDH_NO_DATA = 0x800007D5 - PDH_INVALID_DATA = 0xc0000bc6 + PDH_MORE_DATA = 0x800007D2 + PDH_NO_DATA = 0x800007D5 + PDH_INVALID_DATA = 0xc0000bc6 + PDH_CALC_NEGATIVE_DENOMINATOR = 0x800007D6 PDH_FMT_DOUBLE = 0x00000200 PDH_FMT_LARGE = 0x00000400 @@ -135,11 +139,22 @@ func PdhCollectQueryData(query PDH_HQUERY) (err error) { } func PdhGetFormattedCounterValueDouble(counter PDH_HCOUNTER) (value *float64, err error) { + return PdhGetFormattedCounterValueDoubleHelper(counter, true) +} + +func PdhGetFormattedCounterValueDoubleHelper(counter PDH_HCOUNTER, retry bool) (value *float64, err error) { var pdhValue PDH_FMT_COUNTERVALUE_DOUBLE ret, _, _ := syscall.Syscall6(pdhGetFormattedCounterValue, 4, uintptr(counter), uintptr(PDH_FMT_DOUBLE|PDH_FMT_NOCAP100), 0, uintptr(unsafe.Pointer(&pdhValue)), 0, 0) if syscall.Errno(ret) != windows.ERROR_SUCCESS { - if ret == PDH_INVALID_DATA || ret == PDH_CSTATUS_INVALID_DATA { + if ret == PDH_CALC_NEGATIVE_DENOMINATOR { + if retry { + log.Debugf("Detected performance counter with negative denominator, retrying in 1 second") + time.Sleep(time.Second) + return PdhGetFormattedCounterValueDoubleHelper(counter, false) + } + log.Warningf("Detected performance counter with negative denominator the second time after retry, giving up...") + } else if ret == PDH_INVALID_DATA || ret == PDH_CSTATUS_INVALID_DATA { return nil, nil } return nil, newPdhError(ret) @@ -148,11 +163,22 @@ func PdhGetFormattedCounterValueDouble(counter PDH_HCOUNTER) (value *float64, er } func PdhGetFormattedCounterValueInt64(counter PDH_HCOUNTER) (value *int64, err error) { + return PdhGetFormattedCounterValueInt64Helper(counter, true) +} + +func PdhGetFormattedCounterValueInt64Helper(counter PDH_HCOUNTER, retry bool) (value *int64, err error) { var pdhValue PDH_FMT_COUNTERVALUE_LARGE ret, _, _ := syscall.Syscall6(pdhGetFormattedCounterValue, 4, uintptr(counter), uintptr(PDH_FMT_LARGE), 0, uintptr(unsafe.Pointer(&pdhValue)), 0, 0) if syscall.Errno(ret) != windows.ERROR_SUCCESS { - if ret == PDH_INVALID_DATA || ret == PDH_CSTATUS_INVALID_DATA { + if ret == PDH_CALC_NEGATIVE_DENOMINATOR { + if retry { + log.Debugf("Detected performance counter with negative denominator, retrying in 1 second") + time.Sleep(time.Second) + return PdhGetFormattedCounterValueInt64Helper(counter, false) + } + log.Warningf("Detected performance counter with negative denominator the second time after retry, giving up...") + } else if ret == PDH_INVALID_DATA || ret == PDH_CSTATUS_INVALID_DATA { return nil, nil } return nil, newPdhError(ret) |