public Object createStatement()

in aws-xray-recorder-sdk-sql-postgres/src/main/java/com/amazonaws/xray/sql/postgres/TracingInterceptor.java [93:140]


    public Object createStatement(Object proxy, Method method, Object[] args, Object statementObject) {
        try {
            String name = method.getName();
            String sql = null;
            Constructor<?> constructor = null;
            Map<String, Object> additionalParams = new HashMap<>();
            if (compare(CREATE_STATEMENT, name)) {
                //createStatement
                constructor = getConstructor(CREATE_STATEMENT_INDEX, Statement.class);
            } else if (compare(PREPARE_STATEMENT, name)) {
                additionalParams.put("preparation", "statement");
                sql = (String) args[0];
                constructor = getConstructor(PREPARE_STATEMENT_INDEX, PreparedStatement.class);
            } else if (compare(PREPARE_CALL, name)) {
                additionalParams.put("preparation", "call");
                sql = (String) args[0];
                constructor = getConstructor(PREPARE_CALL_INDEX, CallableStatement.class);
            } else {
                //do nothing, might be a future unsupported method
                //so we better bail out and let the system continue
                return statementObject;
            }
            Statement statement = ((Statement) statementObject);
            Connection connection = statement.getConnection();
            DatabaseMetaData metadata = connection.getMetaData();
            // parse cname for subsegment name
            additionalParams.put("url", metadata.getURL());
            additionalParams.put("user", metadata.getUserName());
            additionalParams.put("driver_version", metadata.getDriverVersion());
            additionalParams.put("database_type", metadata.getDatabaseProductName());
            additionalParams.put("database_version", metadata.getDatabaseProductVersion());
            String hostname = DEFAULT_DATABASE_NAME;
            try {
                URI normalizedUri = new URI(new URI(metadata.getURL()).getSchemeSpecificPart());
                hostname = connection.getCatalog() + "@" + normalizedUri.getHost();
            } catch (URISyntaxException e) {
                logger.warn("Unable to parse database URI. Falling back to default '" + DEFAULT_DATABASE_NAME
                            + "' for subsegment name.", e);
            }

            logger.debug("Instantiating new statement proxy.");
            return constructor.newInstance(new TracingStatementProxy(statementObject, sql, hostname, additionalParams));
        } catch (SQLException | InstantiationException | IllegalAccessException | InvocationTargetException
            | NoSuchMethodException e) {
            logger.warn("Unable to create statement proxy for tracing.", e);
        }
        return statementObject;
    }