in google_guest_agent/diagnostics.go [90:138]
func (d *diagnosticsMgr) Set(ctx context.Context) error {
logger.Infof("Diagnostics: logs export requested.")
diagnosticsEntries, err := readRegMultiString(regKeyBase, diagnosticsRegKey)
if err != nil && err != errRegNotExist {
return err
}
strEntry := newMetadata.Instance.Attributes.Diagnostics
if slices.Contains(diagnosticsEntries, strEntry) {
return nil
}
diagnosticsEntries = append(diagnosticsEntries, strEntry)
var entry diagnosticsEntry
if err := json.Unmarshal([]byte(strEntry), &entry); err != nil {
return err
}
expired, _ := utils.CheckExpired(entry.ExpireOn)
if entry.SignedURL == "" || expired {
return nil
}
args := []string{
"-signedUrl",
entry.SignedURL,
}
if entry.Trace {
args = append(args, "-trace")
}
// If no existing running job, set it to 1 and block other requests
if !atomic.CompareAndSwapInt32(&isDiagnosticsRunning, 0, 1) {
logger.Infof("Diagnostics: reject the request, as an existing process is collecting logs from the system")
return nil
}
go func() {
logger.Infof("Diagnostics: collecting logs from the system.")
res := run.WithCombinedOutput(ctx, diagnosticsCmd, args...)
logger.Infof(res.Combined)
if res.ExitCode != 0 {
logger.Warningf("Error collecting logs: %v", res.Error())
}
// Job is done, unblock the following requests
atomic.SwapInt32(&isDiagnosticsRunning, 0)
}()
return writeRegMultiString(regKeyBase, diagnosticsRegKey, diagnosticsEntries)
}