public static Subsegment forQuery()

in aws-xray-recorder-sdk-sql/src/main/java/com/amazonaws/xray/sql/SqlSubsegments.java [87:153]


    public static Subsegment forQuery(Connection connection, @Nullable String query) {
        DatabaseMetaData metadata;
        ConnectionInfo connectionInfo = connMap.get(connection);
        String subsegmentName = DEFAULT_DATABASE_NAME;

        try {
            metadata = connection.getMetaData();
            String connUrl = metadata.getURL();

            // Parse URL if Oracle
            if (connectionInfo == null && connUrl != null && connUrl.contains("jdbc:oracle")) {
                connectionInfo = OracleConnectionUrlParser.parseUrl(connUrl, new ConnectionInfo.Builder());
                connMap.put(connection, connectionInfo);
            } else if (connectionInfo == null) {
                connectionInfo = new ConnectionInfo.Builder().build();
            }

            // Get database name if available; otherwise fallback to default
            String database;
            if (connectionInfo.getDbName() != null) {
                database = connectionInfo.getDbName();
            } else if (connection.getCatalog() != null) {
                database = connection.getCatalog();
            } else {
                database = DEFAULT_DATABASE_NAME;
            }

            // Get database host if available; otherwise omit host
            String host = null;
            if (connectionInfo.getHost() != null) {
                host = connectionInfo.getHost();
            } else if (connUrl != null) {
                try {
                    host = new URI(new URI(connUrl).getSchemeSpecificPart()).getHost();
                } catch (URISyntaxException e) {
                    logger.debug("Unable to parse database URI. Falling back to default '" + DEFAULT_DATABASE_NAME
                        + "' for subsegment name.", e);
                }
            }

            // Fully formed subsegment name is of form "dbName@host"
            subsegmentName = database + (host != null ? "@" + host : "");
        } catch (SQLException e) {
            logger.debug("Encountered exception while retrieving metadata for SQL subsegment "
                + ", starting blank subsegment instead");
            return AWSXRay.beginSubsegment(subsegmentName);
        }

        Subsegment subsegment = AWSXRay.beginSubsegment(subsegmentName);
        subsegment.setNamespace(Namespace.REMOTE.toString());

        try {
            putSqlIfNotNull(subsegment, URL, connectionInfo.getSanitizedUrl() != null ?
                connectionInfo.getSanitizedUrl() : metadata.getURL());
            putSqlIfNotNull(subsegment, USER, connectionInfo.getUser() != null ?
                connectionInfo.getUser() : metadata.getUserName());
            putSqlIfNotNull(subsegment, DRIVER_VERSION, metadata.getDriverVersion());
            putSqlIfNotNull(subsegment, DATABASE_TYPE, metadata.getDatabaseProductName());
            putSqlIfNotNull(subsegment, DATABASE_VERSION, metadata.getDatabaseProductVersion());
        } catch (SQLException e) {
            logger.debug("Encountered exception while populating SQL subsegment metadata", e);
        }

        putSqlIfNotNull(subsegment, SANITIZED_QUERY, query);

        return subsegment;
    }