|
|
@ -142,44 +142,49 @@ func GetCounterValue(counter windows.Handle) (float64, error) {
|
|
|
|
return value.DoubleValue, nil
|
|
|
|
return value.DoubleValue, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessorQueueLengthGenerator is struct of windows api
|
|
|
|
type Win32PerformanceCounter struct {
|
|
|
|
// adapted from https://github.com/mackerelio/mackerel-agent/
|
|
|
|
PostName string
|
|
|
|
type ProcessorQueueLengthGenerator struct {
|
|
|
|
CounterName string
|
|
|
|
query windows.Handle
|
|
|
|
Query windows.Handle
|
|
|
|
counter *CounterInfo
|
|
|
|
Counter windows.Handle
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewProcessorQueueLengthGenerator is set up windows api
|
|
|
|
func NewWin32PerformanceCounter(postName, counterName string) (*Win32PerformanceCounter, error) {
|
|
|
|
// adapted from https://github.com/mackerelio/mackerel-agent/
|
|
|
|
query, err := CreateQuery()
|
|
|
|
func NewProcessorQueueLengthGenerator() (*ProcessorQueueLengthGenerator, error) {
|
|
|
|
|
|
|
|
g := &ProcessorQueueLengthGenerator{0, nil}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var err error
|
|
|
|
|
|
|
|
g.query, err = CreateQuery()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var counter = Win32PerformanceCounter{
|
|
|
|
counter, err := CreateCounter(g.query, "processor_queue_length", `\System\Processor Queue Length`)
|
|
|
|
Query: query,
|
|
|
|
if err != nil {
|
|
|
|
PostName: postName,
|
|
|
|
|
|
|
|
CounterName: counterName,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
r, _, err := PdhAddCounter.Call(
|
|
|
|
|
|
|
|
uintptr(counter.Query),
|
|
|
|
|
|
|
|
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(counter.CounterName))),
|
|
|
|
|
|
|
|
0,
|
|
|
|
|
|
|
|
uintptr(unsafe.Pointer(&counter.Counter)),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
if r != 0 {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
g.counter = counter
|
|
|
|
return &counter, nil
|
|
|
|
return g, nil
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Generate XXX
|
|
|
|
func (w *Win32PerformanceCounter) GetValue() (float64, error) {
|
|
|
|
// adapted from https://github.com/mackerelio/mackerel-agent/
|
|
|
|
r, _, err := PdhCollectQueryData.Call(uintptr(w.Query))
|
|
|
|
func (g *ProcessorQueueLengthGenerator) Generate() (float64, error) {
|
|
|
|
|
|
|
|
r, _, err := PdhCollectQueryData.Call(uintptr(g.query))
|
|
|
|
|
|
|
|
if r != 0 && err != nil {
|
|
|
|
if r != 0 && err != nil {
|
|
|
|
if r == PDH_NO_DATA {
|
|
|
|
if r == PDH_NO_DATA {
|
|
|
|
return 0.0, fmt.Errorf("%w: this metric has not data", err)
|
|
|
|
return 0.0, fmt.Errorf("%w: this counter has not data", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0.0, err
|
|
|
|
return 0.0, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return GetCounterValue(g.counter.Counter)
|
|
|
|
return GetCounterValue(w.Counter)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func ProcessorQueueLengthCounter() (*Win32PerformanceCounter, error) {
|
|
|
|
|
|
|
|
return NewWin32PerformanceCounter("processor_queue_length", `\System\Processor Queue Length`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// WMIQueryWithContext - wraps wmi.Query with a timed-out context to avoid hanging
|
|
|
|
// WMIQueryWithContext - wraps wmi.Query with a timed-out context to avoid hanging
|
|
|
|