Map fetch()

in aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/plugins/EC2MetadataFetcher.java [62:111]


    Map<EC2Metadata, String> fetch() {
        String token = fetchToken();

        // If token is empty, either IMDSv2 isn't enabled or an unexpected failure happened. We can still get
        // data if IMDSv1 is enabled.
        String identity = fetchIdentity(token);
        if (identity.isEmpty()) {
            // If no identity document, assume we are not actually running on EC2.
            return Collections.emptyMap();
        }

        Map<EC2Metadata, String> result = new HashMap<>();
        try (JsonParser parser = JSON_FACTORY.createParser(identity)) {
            parser.nextToken();

            if (!parser.isExpectedStartObjectToken()) {
                throw new IOException("Invalid JSON:" + identity);
            }

            while (parser.nextToken() != JsonToken.END_OBJECT) {
                String value = parser.nextTextValue();
                switch (parser.getCurrentName()) {
                    case "instanceId":
                        result.put(EC2Metadata.INSTANCE_ID, value);
                        break;
                    case "availabilityZone":
                        result.put(EC2Metadata.AVAILABILITY_ZONE, value);
                        break;
                    case "instanceType":
                        result.put(EC2Metadata.INSTANCE_TYPE, value);
                        break;
                    case "imageId":
                        result.put(EC2Metadata.AMI_ID, value);
                        break;
                    default:
                        parser.skipChildren();
                }
                if (result.size() == EC2Metadata.values().length) {
                    return Collections.unmodifiableMap(result);
                }
            }
        } catch (IOException e) {
            logger.warn("Could not parse identity document.", e);
            return Collections.emptyMap();
        }

        // Getting here means the document didn't have all the metadata fields we wanted.
        logger.warn("Identity document missing metadata: " + identity);
        return Collections.unmodifiableMap(result);
    }