mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-10-20 03:29:05 +02:00
collector: bound MI probe queries in Build with a timeout (#2657)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
1302cf6899
commit
465fccbe69
@@ -772,6 +772,35 @@ func Test_MI_QueryTimeout(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// Test_MI_Session_QueryTimeout checks that the timeout passed to Session.Query,
|
||||
// e.g. mi.BuildQueryTimeout, reaches MI and surfaces as the native result.
|
||||
func Test_MI_Session_QueryTimeout(t *testing.T) {
|
||||
application, err := mi.ApplicationInitialize()
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() { require.NoError(t, application.Close()) })
|
||||
|
||||
destinationOptions, err := application.NewDestinationOptions()
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, destinationOptions.SetLocale(mi.LocaleEnglish))
|
||||
|
||||
session, err := application.NewSession(destinationOptions)
|
||||
require.NoError(t, err)
|
||||
t.Cleanup(func() { require.NoError(t, session.Close()) })
|
||||
|
||||
query, err := mi.NewQuery("select * from win32_process")
|
||||
require.NoError(t, err)
|
||||
|
||||
var processes []win32Process
|
||||
|
||||
err = session.Query(&processes, mi.NamespaceRootCIMv2, query, time.Millisecond)
|
||||
require.ErrorIs(t, err, mi.MI_RESULT_INVALID_OPERATION_TIMEOUT)
|
||||
|
||||
processes = nil
|
||||
|
||||
require.NoError(t, session.Query(&processes, mi.NamespaceRootCIMv2, query, mi.BuildQueryTimeout))
|
||||
require.NotEmpty(t, processes)
|
||||
}
|
||||
|
||||
func Test_MI_Query_Uint16Array(t *testing.T) {
|
||||
application, err := mi.ApplicationInitialize()
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -29,6 +29,12 @@ import (
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
// BuildQueryTimeout bounds the probe queries collectors run in Build. Build
|
||||
// has no scrape budget, and a zero timeout sets no MI timeout, so a stalled
|
||||
// provider would otherwise block startup. A timed-out query fails with
|
||||
// MI_RESULT_INVALID_OPERATION_TIMEOUT. MI ignores timeouts below 1ms.
|
||||
const BuildQueryTimeout = 30 * time.Second
|
||||
|
||||
// Session represents a session.
|
||||
//
|
||||
// https://learn.microsoft.com/en-us/windows/win32/api/mi/ns-mi-mi_session
|
||||
|
||||
Reference in New Issue
Block a user