in aws-xray-recorder-sdk-sql-mysql/src/main/java/com/amazonaws/xray/sql/mysql/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(statement, sql, hostname, additionalParams));
} catch (SQLException | InstantiationException | IllegalAccessException | InvocationTargetException |
NoSuchMethodException e) {
logger.warn("Unable to create statement proxy for tracing.", e);
}
return statementObject;
}