func()

in internal/sqlservermetrics/sqlservermetrics_windows.go [42:121]


func (s *SQLServerMetrics) osCollection(ctx context.Context) error {
	if !s.Config.GetCollectionConfiguration().GetCollectGuestOsMetrics() {
		return nil
	}
	wlm, err := s.initCollection(ctx, true)
	if err != nil {
		usagemetrics.Error(usagemetrics.WorkloadManagerConnectionError)
		return err
	}

	for _, credentialCfg := range s.Config.GetCredentialConfigurations() {
		guestCfg := guestConfigFromCredential(credentialCfg)
		if err := validateCredCfgGuest(s.Config.GetRemoteCollection(), !guestCfg.LinuxRemote, guestCfg, credentialCfg.GetVmProperties().GetInstanceId(), credentialCfg.GetVmProperties().GetInstanceName()); err != nil {
			usagemetrics.Error(usagemetrics.SQLServerInvalidConfigurationsError)
			log.Logger.Errorw("Invalid credential configuration", "error", err)
			if !s.Config.GetRemoteCollection() {
				break
			}
			continue
		}

		targetInstanceProps := sip
		var c guestoscollector.GuestCollector
		if s.Config.GetRemoteCollection() {
			// remote collection
			targetInstanceProps = instanceProperties{
				InstanceID: credentialCfg.GetVmProperties().GetInstanceId(),
				Instance:   credentialCfg.GetVmProperties().GetInstanceName(),
			}
			host := guestCfg.ServerName
			username := guestCfg.GuestUserName
			if !guestCfg.LinuxRemote {
				log.Logger.Debug("Starting remote win guest collection for ip " + host)
				projectID := guestCfg.ProjectID
				if projectID == "" {
					projectID = sip.ProjectID
				}
				pswd, err := secretValue(ctx, projectID, guestCfg.GuestSecretName)
				if err != nil {
					usagemetrics.Error(usagemetrics.SecretManagerValueError)
					log.Logger.Errorw("Collection failed", "target", guestCfg.ServerName, "error", fmt.Errorf("failed to get secret value: %v", err))
					if !s.Config.GetRemoteCollection() {
						break
					}
					continue
				}
				c = guestoscollector.NewWindowsCollector(host, username, pswd)
			} else {
				// on local windows vm collecting on remote linux vm's, we use ssh, otherwise we use wmi
				log.Logger.Debug("Starting remote linux guest collection for ip " + host)
				// disks only used for local linux collection
				c = guestoscollector.NewLinuxCollector(nil, host, username, guestCfg.LinuxSSHPrivateKeyPath, true, guestCfg.GuestPortNumber)
			}
		} else {
			// local win collection
			log.Logger.Debug("Starting local win guest collection")
			c = guestoscollector.NewWindowsCollector(nil, nil, nil)
		}

		details := []sqlserverutils.MetricDetails{}
		log.Logger.Debug("Collecting guest rules")
		details = append(details, c.CollectGuestRules(ctx, s.Config.GetCollectionTimeout().AsDuration()))
		if err := guestoscollector.UnknownOsFields(&details); err != nil {
			log.Logger.Warnf("RunOSCollection: Failed to mark unknown collected fields. error: %v", err)
		}
		log.Logger.Debug("Collecting guest rules completes")

		log.Logger.Debugf("Source vm %s is sending os collected data on target machine, %s, to workload manager.", sip.Instance, targetInstanceProps.Instance)
		updateCollectedData(wlm, sip, targetInstanceProps, details)
		sendRequestToWLM(ctx, wlm, sip.Name, s.Config.GetMaxRetries(), s.Config.GetRetryFrequency().AsDuration())

		// Local collection.
		// Exit the loop. Only take the first credential in the credentialconfiguration array.
		if !s.Config.GetRemoteCollection() {
			break
		}
	}

	return nil
}