in internal/sqlservermetrics/sqlservermetrics_windows.go [154:249]
func SQLCollection(ctx context.Context, path, logPrefix string, cfg *configpb.Configuration, onetime bool) error {
if !cfg.GetCollectionConfiguration().GetCollectSqlMetrics() {
return nil
}
if cfg.GetCredentialConfiguration() == nil || len(cfg.GetCredentialConfiguration()) == 0 {
return fmt.Errorf("empty credentials")
}
wlm, err := initCollection(ctx)
if err != nil {
return err
}
if !onetime {
if err := checkAgentStatus(wlm, path); err != nil {
return err
}
}
sourceInstanceProps := SIP
timeout := time.Duration(cfg.GetCollectionTimeoutSeconds()) * time.Second
interval := time.Duration(cfg.GetRetryIntervalInSeconds()) * time.Second
log.Logger.Info("SQL rules collection starts.")
for _, credentialCfg := range cfg.GetCredentialConfiguration() {
validationDetails := initDetails()
guestCfg := guestConfigFromCredential(credentialCfg)
for _, sqlCfg := range sqlConfigFromCredential(credentialCfg) {
if err := validateCredCfgSQL(cfg.GetRemoteCollection(), !guestCfg.LinuxRemote, sqlCfg, guestCfg, credentialCfg.GetInstanceId(), credentialCfg.GetInstanceName()); err != nil {
log.Logger.Errorw("Invalid credential configuration", "error", err)
UsageMetricsLogger.Error(agentstatus.InvalidConfigurationsError)
continue
}
pswd, err := secretValue(ctx, sourceInstanceProps.ProjectID, sqlCfg.SecretName)
if err != nil {
log.Logger.Errorw("Failed to get secret value", "error", err)
UsageMetricsLogger.Error(agentstatus.SecretValueError)
continue
}
conn := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;", sqlCfg.Host, sqlCfg.Username, pswd, sqlCfg.PortNumber)
details, err := runSQLCollection(ctx, conn, timeout, !guestCfg.LinuxRemote)
if err != nil {
log.Logger.Errorw("Failed to run sql collection", "error", err)
UsageMetricsLogger.Error(agentstatus.SQLCollectionFailure)
continue
}
for _, detail := range details {
for _, field := range detail.Fields {
field["host_name"] = sqlCfg.Host
field["port_number"] = fmt.Sprintf("%d", sqlCfg.PortNumber)
}
}
// getting physical drive if on local windows collecting sql on linux remote
if cfg.GetRemoteCollection() && guestCfg.LinuxRemote {
addPhysicalDriveRemoteLinux(details, guestCfg)
} else {
addPhysicalDriveLocal(ctx, details, true)
}
for i, detail := range details {
for _, vd := range validationDetails {
if detail.Name == vd.Name {
detail.Fields = append(vd.Fields, detail.Fields...)
details[i] = detail
break
}
}
}
validationDetails = details
}
targetInstanceProps := sourceInstanceProps
// update targetInstanceProps value for remote collections.
if cfg.GetRemoteCollection() {
// remote collection
targetInstanceProps = InstanceProperties{
InstanceID: credentialCfg.GetInstanceId(),
Instance: credentialCfg.GetInstanceName(),
}
}
updateCollectedData(wlm, sourceInstanceProps, targetInstanceProps, validationDetails)
if onetime {
target := "localhost"
if cfg.GetRemoteCollection() {
target = targetInstanceProps.Instance
}
persistCollectedData(wlm, filepath.Join(filepath.Dir(logPrefix), fmt.Sprintf("%s-%s.json", target, "sql")))
} else {
log.Logger.Debugf("Source vm %s is sending collected sql data on target machine, %s, to workload manager.", sourceInstanceProps.Instance, targetInstanceProps.Instance)
sendRequestToWLM(wlm, sourceInstanceProps.Name, cfg.GetMaxRetries(), interval)
}
}
log.Logger.Info("SQL rules collection ends.")
return nil
}