in oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/k8s/K8sInfoRegistry.java [45:120]
private K8sInfoRegistry() {
ipPodMap = CacheBuilder.newBuilder()
.expireAfterWrite(Duration.ofMinutes(3))
.build(CacheLoader.from(ip -> KubernetesPods.INSTANCE
.findByIP(ip)
.map(it -> ObjectID
.builder()
.name(it.getMetadata().getName())
.namespace(it.getMetadata().getNamespace())
.build())
.orElse(ObjectID.EMPTY)));
ipServiceMap = CacheBuilder.newBuilder()
.expireAfterWrite(Duration.ofMinutes(3))
.build(CacheLoader.from(ip -> KubernetesServices.INSTANCE
.list()
.stream()
.filter(it -> it.getSpec() != null)
.filter(it -> it.getStatus() != null)
.filter(it -> it.getMetadata() != null)
.filter(it -> (it.getSpec().getClusterIPs() != null &&
it.getSpec().getClusterIPs().stream()
.anyMatch(clusterIP -> Objects.equals(clusterIP, ip)))
|| (it.getStatus().getLoadBalancer() != null &&
it.getStatus().getLoadBalancer().getIngress() != null &&
it.getStatus().getLoadBalancer().getIngress().stream()
.anyMatch(ingress -> Objects.equals(ingress.getIp(), ip))))
.map(it -> ObjectID
.builder()
.name(it.getMetadata().getName())
.namespace(it.getMetadata().getNamespace())
.build())
.findFirst()
.orElse(ObjectID.EMPTY)));
podServiceMap = CacheBuilder.newBuilder()
.expireAfterWrite(Duration.ofMinutes(3))
.build(CacheLoader.from(podObjectID -> {
final Optional<Pod> pod = KubernetesPods.INSTANCE
.findByObjectID(
ObjectID
.builder()
.name(podObjectID.name())
.namespace(podObjectID.namespace())
.build());
if (!pod.isPresent()
|| pod.get().getMetadata() == null
|| pod.get().getMetadata().getLabels() == null) {
return ObjectID.EMPTY;
}
final Optional<Service> service = KubernetesServices.INSTANCE
.list()
.stream()
.filter(it -> it.getMetadata() != null)
.filter(it -> Objects.equals(it.getMetadata().getNamespace(), pod.get().getMetadata().getNamespace()))
.filter(it -> it.getSpec() != null)
.filter(it -> requireNonNull(it.getSpec()).getSelector() != null)
.filter(it -> !it.getSpec().getSelector().isEmpty())
.filter(it -> {
final Map<String, String> labels = pod.get().getMetadata().getLabels();
final Map<String, String> selector = it.getSpec().getSelector();
return hasIntersection(selector.entrySet(), labels.entrySet());
})
.findFirst();
if (!service.isPresent()) {
return ObjectID.EMPTY;
}
return ObjectID
.builder()
.name(service.get().getMetadata().getName())
.namespace(service.get().getMetadata().getNamespace())
.build();
}));
}