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
}
}
}