func()

in plugins/processors/awsapplicationsignals/internal/resolver/kubernetes.go [244:303]


func (e *kubernetesResolver) getWorkloadAndNamespaceByIP(ip string) (string, string, error) {
	// If extension is available, rely on that
	if e.useExtension {
		ext := k8smetadata.GetKubernetesMetadata()
		if ext == nil {
			return "", "", errors.New("extension not found (unexpected)")
		}
		pm := ext.GetPodMetadataFromPodIP(ip)
		if pm.Workload != "" {
			return pm.Workload, pm.Namespace, nil
		}

		if svcKeyVal := ext.GetServiceAndNamespaceFromClusterIP(ip); svcKeyVal != "" {
			sm := ext.GetPodMetadataFromServiceAndNamespace(svcKeyVal)
			if sm.Workload != "" {
				return sm.Workload, sm.Namespace, nil
			}
		}
		return "", "", fmt.Errorf("extension could not resolve IP: %s", ip)
	}

	// Otherwise watchers
	if e.useListPod {
		// use results from pod watcher
		if podKey, ok := e.ipToPod.Load(ip); ok {
			pod := podKey.(string)
			if workloadKey, ok := e.podToWorkloadAndNamespace.Load(pod); ok {
				workload, namespace := k8sclient.ExtractResourceAndNamespace(workloadKey.(string))
				return workload, namespace, nil
			}
		}
	} else {
		// use results from endpoint slice watcher
		if pmVal, ok := e.ipToWorkloadAndNamespace.Load(ip); ok {
			pm := pmVal.(k8sclient.PodMetadata)
			return pm.Workload, pm.Namespace, nil
		}
	}

	// Not found in IP->workload, so check IP->service, then service->workload
	if svcKeyVal, ok := e.ipToServiceAndNamespace.Load(ip); ok {
		svcAndNS := svcKeyVal.(string)
		if e.serviceToWorkload != nil {
			if pmVal, ok := e.serviceToWorkload.Load(svcAndNS); ok {
				// For EndpointSlice watchers, the value is k8sclient.PodMetadata
				// For listPod approach, the value might be "workload@namespace"
				switch val := pmVal.(type) {
				case k8sclient.PodMetadata:
					return val.Workload, val.Namespace, nil
				case string:
					workload, namespace := k8sclient.ExtractResourceAndNamespace(val)
					return workload, namespace, nil
				default:
					e.logger.Debug("Unknown type in serviceToWorkload map")
				}
			}
		}
	}
	return "", "", errors.New("no kubernetes workload found for ip: " + ip)
}