Skip to content

Commit 63fe91c

Browse files
authored
fix(exporter): count only the query result as the exporter coming back (#140)
grpc.NewClient does not dial, so its success marked a dead exporter as reachable before every query and the next failure warned again: on a node with a stale socket the warning still repeated every 10s. Only the List result now decides reachability. Signed-off-by: mesutoezdil <mesudozdil@gmail.com>
1 parent ae25b32 commit 63fe91c

2 files changed

Lines changed: 29 additions & 2 deletions

File tree

‎internal/pkg/exporter/health.go‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ import (
3737
pluginapi "k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1"
3838
)
3939

40+
// healthSocket is the exporter's gRPC socket; tests point it elsewhere.
41+
var healthSocket = "/var/lib/amd-metrics-exporter/amdgpu_device_metrics_exporter_grpc.socket"
42+
4043
const (
41-
healthSocket = "/var/lib/amd-metrics-exporter/amdgpu_device_metrics_exporter_grpc.socket"
4244
queryTimeout = 5 * time.Second
4345
xcpPrefix = "amdgpu_xcp_"
4446
)
@@ -59,7 +61,10 @@ func getGPUHealth() (hMap map[string]string, err error) {
5961
conn, err := grpc.NewClient(healthSvcAddress,
6062
grpc.WithTransportCredentials(insecure.NewCredentials()),
6163
)
62-
if logExporterState(err) {
64+
// NewClient does not dial, so its success says nothing about the
65+
// exporter; only the List result below marks it reachable again
66+
if err != nil {
67+
logExporterState(err)
6368
return
6469
}
6570

‎internal/pkg/exporter/health_test.go‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,25 @@ func TestLogExporterStateLogsTransitionsOnce(t *testing.T) {
6565
t.Errorf("warnings = %d, want 2", warnings)
6666
}
6767
}
68+
69+
// A stale socket fails every query; NewClient succeeding without dialing must
70+
// not count as the exporter coming back, or each check warns again.
71+
func TestStaleSocketWarnsOnce(t *testing.T) {
72+
sock := filepath.Join(t.TempDir(), "exporter.socket")
73+
if err := os.WriteFile(sock, nil, 0o600); err != nil {
74+
t.Fatal(err)
75+
}
76+
oldSock, oldWarn := healthSocket, warnf
77+
warnings := 0
78+
healthSocket, warnf = sock, func(string, ...any) { warnings++ }
79+
exporterDown.Store(false)
80+
t.Cleanup(func() { healthSocket, warnf = oldSock, oldWarn; exporterDown.Store(false) })
81+
for range 3 {
82+
if _, err := getGPUHealth(); err == nil {
83+
t.Fatal("query over a stale socket succeeded")
84+
}
85+
}
86+
if warnings != 1 {
87+
t.Errorf("warnings = %d over 3 failed checks, want 1", warnings)
88+
}
89+
}

0 commit comments

Comments
 (0)