diff --git a/pkg/fleet/installer/packages/datadog_agent_linux.go b/pkg/fleet/installer/packages/datadog_agent_linux.go index b750a8327ad4..0ef5912965fa 100644 --- a/pkg/fleet/installer/packages/datadog_agent_linux.go +++ b/pkg/fleet/installer/packages/datadog_agent_linux.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "path/filepath" + "slices" "strings" "github.com/DataDog/datadog-agent/pkg/fleet/installer/installinfo" @@ -481,11 +482,11 @@ func (s *datadogAgentService) StopStable(ctx HookContext) error { } switch service.GetServiceManagerType() { case service.SystemdType: - return systemd.StopUnits(ctx, s.SystemdUnitsStable...) + return systemd.StopUnits(ctx, reverseStringSlice(s.SystemdUnitsStable)...) case service.UpstartType: - return upstart.StopAll(ctx, s.UpstartServices...) + return upstart.StopAll(ctx, reverseStringSlice(s.UpstartServices)...) case service.SysvinitType: - return sysvinit.StopAll(ctx, s.SysvinitServices...) + return sysvinit.StopAll(ctx, reverseStringSlice(s.SysvinitServices)...) default: return fmt.Errorf("unsupported service manager") } @@ -659,3 +660,10 @@ func writeEmbeddedUnit(dir string, unit string, content []byte) error { } return nil } + +func reverseStringSlice(slice []string) []string { + reversed := make([]string, len(slice)) + copy(reversed, slice) + slices.Reverse(reversed) + return reversed +} diff --git a/pkg/fleet/installer/packages/service/systemd/systemd.go b/pkg/fleet/installer/packages/service/systemd/systemd.go index 0efd423c29a5..912bdbea999b 100644 --- a/pkg/fleet/installer/packages/service/systemd/systemd.go +++ b/pkg/fleet/installer/packages/service/systemd/systemd.go @@ -16,6 +16,7 @@ import ( "os/exec" "path/filepath" "syscall" + "time" "github.com/DataDog/datadog-agent/pkg/fleet/installer/telemetry" "github.com/DataDog/datadog-agent/pkg/util/log" @@ -142,3 +143,13 @@ func IsRunning() (running bool, err error) { } return true, nil } + +// JournaldLogs returns the logs for a given unit since a given time +func JournaldLogs(ctx context.Context, unit string, since time.Time) (string, error) { + journalctlCmd := exec.CommandContext(ctx, "journalctl", "_COMM=systemd", "--unit", unit, "-e", "--no-pager", "--since", since.Format(time.RFC3339)) + stdout, err := journalctlCmd.Output() + if err != nil { + return "", err + } + return string(stdout), nil +} diff --git a/pkg/fleet/installer/setup/common/services_nix.go b/pkg/fleet/installer/setup/common/services_nix.go index 1e493ce1efc1..1e635b70e603 100644 --- a/pkg/fleet/installer/setup/common/services_nix.go +++ b/pkg/fleet/installer/setup/common/services_nix.go @@ -8,32 +8,29 @@ package common import ( - "bytes" "fmt" - "os/exec" + "time" + + "github.com/DataDog/datadog-agent/pkg/fleet/installer/packages/service/systemd" + "github.com/DataDog/datadog-agent/pkg/fleet/installer/telemetry" ) // restartServices restarts the services that need to be restarted after a package upgrade or // an install script re-run; because the configuration may have changed. func (s *Setup) restartServices(pkgs []packageWithVersion) error { + t := time.Now() + span, ctx := telemetry.StartSpanFromContext(s.Ctx, "restartServices") for _, pkg := range pkgs { switch pkg.name { case DatadogAgentPackage: - if err := restartService("datadog-agent.service"); err != nil { - return err + err := systemd.RestartUnit(ctx, "datadog-agent.service") + if err != nil { + logs, logsErr := systemd.JournaldLogs(ctx, "datadog-agent.service", t) + span.SetTag("journald_logs", logs) + span.SetTag("journald_logs_err", logsErr) + return fmt.Errorf("failed to restart datadog-agent.service: %w", err) } } } return nil } - -func restartService(unit string) error { - cmd := exec.Command("systemctl", "restart", unit) - stderr := bytes.Buffer{} - cmd.Stderr = &stderr - err := cmd.Run() - if err != nil { - return fmt.Errorf("failed to restart %s (%s): %s", unit, err.Error(), stderr.String()) - } - return nil -}