private static CloudProviderInfo tryAllCloudProviders()

in apm-agent-core/src/main/java/co/elastic/apm/agent/impl/metadata/CloudMetadataProvider.java [140:193]


    private static CloudProviderInfo tryAllCloudProviders(final CoreConfigurationImpl.CloudProvider cloudProvider, final int queryTimeoutMs)
        throws InterruptedException, ExecutionException, TimeoutException {

        ExecutorService executor = ExecutorUtils.createThreadDaemonPool("cloud-metadata", 2, 2);
        CloudProviderInfo cloudProviderInfo = null;
        Future<CloudProviderInfo> awsMetadata;
        Future<CloudProviderInfo> gcpMetadata;

        try {
            awsMetadata = executor.submit(new Callable<CloudProviderInfo>() {
                @Nullable
                @Override
                public CloudProviderInfo call() {
                    CloudProviderInfo awsInfo = null;
                    try {
                        awsInfo = getAwsMetadata(queryTimeoutMs, cloudProvider);
                    } catch (Exception e) {
                        // Expected - trial and error method
                    }
                    return awsInfo;
                }
            });

            gcpMetadata = executor.submit(new Callable<CloudProviderInfo>() {
                @Nullable
                @Override
                public CloudProviderInfo call() {
                    CloudProviderInfo gcpInfo = null;
                    try {
                        gcpInfo = getGcpMetadata(queryTimeoutMs);
                    } catch (Exception e) {
                        // Expected - trial and error method
                    }
                    return gcpInfo;
                }
            });
        } finally {
            executor.shutdown();
        }

        long futureTimeout = queryTimeoutMs + 200;
        try {
            cloudProviderInfo = getAzureMetadata(queryTimeoutMs);
        } catch (Exception e) {
            // Expected - trial and error method
        }
        if (cloudProviderInfo == null) {
            cloudProviderInfo = awsMetadata.get(futureTimeout, TimeUnit.MILLISECONDS);
        }
        if (cloudProviderInfo == null) {
            cloudProviderInfo = gcpMetadata.get(futureTimeout, TimeUnit.MILLISECONDS);
        }
        return cloudProviderInfo;
    }