Skip to content

Commit

Permalink
Merge pull request #22 from newrelic/mysql-4.5-queries
Browse files Browse the repository at this point in the history
fix: added queries in db trace
  • Loading branch information
gsidhwani-nr authored Feb 5, 2025
2 parents 15efc13 + 2b0920d commit db68f40
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 3 deletions.
2 changes: 1 addition & 1 deletion Vertx-SQLClient-4.1.0/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jar {
}

verifyInstrumentation {
passes 'io.vertx:vertx-sql-client:[4.1.0,4.5.0)'
passes 'io.vertx:vertx-sql-client:[4.1.0,)'
excludeRegex '.*SNAPSHOT'
excludeRegex '.*milestone.*'
excludeRegex '.*alpha.*'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package com.nr.instrumentation.sqlclient;

/*
*
* * Copyright 2020 New Relic Corporation. All rights reserved.
* * SPDX-License-Identifier: Apache-2.0
*
*/

import com.newrelic.api.agent.QueryConverter;

import java.util.regex.Pattern;

public class R2dbcObfuscator {
private static final int PATTERN_SWITCHES = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
private static final String SINGLE_QUOTE = "'(?:[^']|'')*?(?:\\\\'.*|'(?!'))";
private static final String DOUBLE_QUOTE = "\"(?:[^\"]|\"\")*?(?:\\\\\".*|\"(?!\"))";
private static final String DOLLAR_QUOTE = "(\\$(?!\\d)[^$]*?\\$).*?(?:\\1|$)";
private static final String COMMENT = "(?:#|--).*?(?=\\r|\\n|$)";
private static final String MULTILINE_COMMENT = "/\\*(?:[^/]|/[^*])*?(?:\\*/|/\\*.*)";
private static final String UUID = "\\{?(?:[0-9a-f]\\-*){32}\\}?";
private static final String HEX = "0x[0-9a-f]+";
private static final String BOOLEAN = "\\b(?:true|false|null)\\b";
private static final String NUMBER = "-?\\b(?:[0-9_]+\\.)?[0-9_]+([eE][+-]?[0-9_]+)?";
private static final Pattern ALL_DIALECTS_PATTERN;
private static final Pattern ALL_UNMATCHED_PATTERN;
private static final Pattern MYSQL_DIALECT_PATTERN;
private static final Pattern MYSQL_UNMATCHED_PATTERN;
private static final Pattern POSTGRES_DIALECT_PATTERN;
private static final Pattern POSTGRES_UNMATCHED_PATTERN;

public static final QueryConverter<String> QUERY_CONVERTER;
public static final QueryConverter<String> MYSQL_QUERY_CONVERTER;
public static final QueryConverter<String> POSTGRES_QUERY_CONVERTER;

static {
ALL_DIALECTS_PATTERN = Pattern.compile(String.join("|", SINGLE_QUOTE, DOUBLE_QUOTE, DOLLAR_QUOTE, COMMENT, MULTILINE_COMMENT, UUID, HEX, BOOLEAN, NUMBER), PATTERN_SWITCHES);
ALL_UNMATCHED_PATTERN = Pattern.compile("'|\"|/\\*|\\*/|\\$", PATTERN_SWITCHES);
MYSQL_DIALECT_PATTERN = Pattern.compile(String.join("|", SINGLE_QUOTE, DOUBLE_QUOTE, COMMENT, MULTILINE_COMMENT, HEX, BOOLEAN, NUMBER), PATTERN_SWITCHES);
MYSQL_UNMATCHED_PATTERN = Pattern.compile("'|\"|/\\*|\\*/", PATTERN_SWITCHES);
POSTGRES_DIALECT_PATTERN = Pattern.compile(String.join("|", SINGLE_QUOTE, DOLLAR_QUOTE, COMMENT, MULTILINE_COMMENT, UUID, BOOLEAN, NUMBER), PATTERN_SWITCHES);
POSTGRES_UNMATCHED_PATTERN = Pattern.compile("'|/\\*|\\*/|\\$(?!\\?)", PATTERN_SWITCHES);


QUERY_CONVERTER = new QueryConverter<String>() {
@Override
public String toRawQueryString(String statement) {
return statement;
}

@Override
public String toObfuscatedQueryString(String statement) {
return obfuscateSql(statement, ALL_DIALECTS_PATTERN, ALL_UNMATCHED_PATTERN);
}
};

MYSQL_QUERY_CONVERTER = new QueryConverter<String>() {
@Override
public String toRawQueryString(String statement) {
return statement;
}

@Override
public String toObfuscatedQueryString(String statement) {
return obfuscateSql(statement, MYSQL_DIALECT_PATTERN, MYSQL_UNMATCHED_PATTERN);
}
};

POSTGRES_QUERY_CONVERTER = new QueryConverter<String>() {
@Override
public String toRawQueryString(String statement) {
return statement;
}

@Override
public String toObfuscatedQueryString(String statement) {
return obfuscateSql(statement, POSTGRES_DIALECT_PATTERN, POSTGRES_UNMATCHED_PATTERN);
}
};
}

private static String obfuscateSql(String sql, Pattern dialect, Pattern unmatched) {
if (sql == null || sql.length() == 0) {
return sql;
}
String obfuscatedSql = dialect.matcher(sql).replaceAll("?");
return unmatched.matcher(obfuscatedSql).find() ? "?" : obfuscatedSql;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.newrelic.api.agent.weaver.Weave;
import com.newrelic.api.agent.weaver.Weaver;
import com.nr.instrumentation.sqlclient.NRHandlerWrapper;
import com.nr.instrumentation.sqlclient.R2dbcObfuscator;
import com.nr.instrumentation.sqlclient.SQLUtils;

import io.vertx.core.AsyncResult;
Expand All @@ -25,7 +26,7 @@ public abstract class SqlClientBase {

@Trace
public Query<RowSet<Row>> query(String sql) {
Query<RowSet<Row>> q = Weaver.callOriginal();
Query q = Weaver.callOriginal();
return q;
}

Expand All @@ -49,7 +50,8 @@ public void execute(Handler<AsyncResult<R>> handler) {
ParsedDatabaseStatement parsedStmt = SQLUtils.getParsed(sql);

params = DatastoreParameters.product(dbType).collection(parsedStmt.getModel())
.operation(parsedStmt.getOperation()).build();
.operation(parsedStmt.getOperation()).noInstance().databaseName(dbType)
.slowQuery(sql, R2dbcObfuscator.MYSQL_QUERY_CONVERTER).build();
}
NRHandlerWrapper wrapper = new NRHandlerWrapper(handler, segment, params);
handler = wrapper;
Expand Down

0 comments on commit db68f40

Please sign in to comment.