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:
Jan-Otto Kröpke
2026-10-10 18:05:15 +02:00
committed by GitHub
co-authored by Claude Opus 5.5
parent 1302cf6899
commit 465fccbe69
9 changed files with 45 additions and 5 deletions
+29
View File
@@ -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)
+6
View File
@@ -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