func runDiscovery()

in internal/system/discovery.go [253:343]


func runDiscovery(ctx context.Context, a any) {
	log.CtxLogger(ctx).Info("Starting SAP System Discovery")
	var args runDiscoveryArgs
	var ok bool
	if args, ok = a.(runDiscoveryArgs); !ok {
		log.CtxLogger(ctx).Warn("args is not of type runDiscoveryArgs")
		return
	}
	cp := args.config.GetCloudProperties()
	if cp == nil {
		log.CtxLogger(ctx).Warn("No Metadata Cloud Properties found, cannot collect resource information from the Compute API")
		return
	}

	updateTicker := time.NewTicker(args.config.GetDiscoveryConfiguration().GetSystemDiscoveryUpdateFrequency().AsDuration())
	for {
		sapSystems := args.d.discoverSAPSystems(ctx, cp, args.config)
		log.CtxLogger(ctx).Debugw("Discovered SAP Systems", "systems", sapSystems)

		locationParts := strings.Split(cp.GetZone(), "-")
		region := strings.Join([]string{locationParts[0], locationParts[1]}, "-")

		// Write SAP system discovery data only if sap_system_discovery is enabled.
		if args.config.GetDiscoveryConfiguration().GetEnableDiscovery().GetValue() {
			log.CtxLogger(ctx).Info("Sending systems to WLM API")
			for _, sys := range sapSystems {
				sys.ProjectNumber = cp.GetNumericProjectId()
				sys.UpdateTime = timestamppb.Now()
				// Remove fields only used for local discovery:
				// resource.instanceProperties.diskDeviceNames
				var comps []*spb.SapDiscovery_Component
				if sys.ApplicationLayer != nil {
					comps = append(comps, sys.ApplicationLayer)
				}
				if sys.DatabaseLayer != nil {
					comps = append(comps, sys.DatabaseLayer)
				}
				for len(comps) > 0 {
					comp := comps[len(comps)-1]
					comps = comps[:len(comps)-1]
					if comp.ReplicationSites != nil {
						for _, site := range comp.ReplicationSites {
							comps = append(comps, site.Component)
						}
					}
					for _, res := range comp.GetResources() {
						if res.GetInstanceProperties() != nil {
							res.InstanceProperties.DiskDeviceNames = nil
						}
					}
				}
				log.CtxLogger(ctx).Debugw("System to send to WLM", "system", sys)
				// Send System to DW API
				insightRequest := &dwpb.WriteInsightRequest{
					Insight: &dwpb.Insight{
						SapDiscovery: sys,
						InstanceId:   cp.GetInstanceId(),
					},
				}
				insightRequest.AgentVersion = configuration.AgentVersion

				err := args.d.WlmService.WriteInsight(cp.ProjectId, region, insightRequest)
				if err != nil {
					log.CtxLogger(ctx).Infow("Encountered error writing to WLM", "error", err)
				}

				if args.d.CloudLogInterface == nil {
					continue
				}
				err = args.d.writeToCloudLogging(sys)
				if err != nil {
					log.CtxLogger(ctx).Infow("Encountered error writing to cloud logging", "error", err)
				}
			}
		}

		log.CtxLogger(ctx).Info("Done SAP System Discovery")

		args.d.systemMu.Lock()
		args.d.systems = sapSystems
		args.d.systemMu.Unlock()

		select {
		case <-ctx.Done():
			log.CtxLogger(ctx).Info("SAP Discovery cancellation requested")
			return
		case <-updateTicker.C:
			continue
		}
	}
}