diff --git a/cmd/windows_exporter/0_service.go b/cmd/windows_exporter/0_service.go index a2260370..3208afe2 100644 --- a/cmd/windows_exporter/0_service.go +++ b/cmd/windows_exporter/0_service.go @@ -55,7 +55,7 @@ var ( stopCh = make(chan struct{}) // serviceManagerFinishedCh is a channel to send a signal to the main function that the service manager has stopped the service. - serviceManagerFinishedCh = make(chan struct{}) + serviceManagerFinishedCh = make(chan struct{}, 1) ) // IsService variable declaration allows initiating time-sensitive components like registering the Windows service diff --git a/internal/collector/service/service.go b/internal/collector/service/service.go index ce623eba..56b3f9c5 100644 --- a/internal/collector/service/service.go +++ b/internal/collector/service/service.go @@ -422,15 +422,6 @@ func (c *Collector) getProcessStartTime(pid uint32) (uint64, error) { return 0, fmt.Errorf("failed to open process %w", err) } - defer func(handle windows.Handle) { - err := windows.CloseHandle(handle) - if err != nil { - c.logger.Warn("failed to close process handle", - slog.Any("err", err), - ) - } - }(handle) - var ( creation windows.Filetime exit windows.Filetime @@ -439,6 +430,14 @@ func (c *Collector) getProcessStartTime(pid uint32) (uint64, error) { ) err = windows.GetProcessTimes(handle, &creation, &exit, &krn, &user) + + if err := windows.CloseHandle(handle); err != nil { + c.logger.LogAttrs(context.Background(), slog.LevelWarn, "failed to close process handle", + slog.Any("err", err), + slog.Uint64("pid", uint64(pid)), + ) + } + if err != nil { return 0, fmt.Errorf("failed to get process times %w", err) } @@ -479,7 +478,7 @@ func (c *Collector) getServiceConfig(service *mgr.Service) (mgr.Config, error) { *buf = make([]byte, bytesNeeded) } - c.serviceConfigPoolBytes.Put(buf) + defer c.serviceConfigPoolBytes.Put(buf) return mgr.Config{ BinaryPathName: windows.UTF16PtrToString(serviceConfig.BinaryPathName),