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